2012-04-17 12 views
1

私はメインのファイルでstd :: ofstreamへの静的参照を初期化する方法は?

static std::ofstream &_rout;

ofstream out("output.txt"); 
ofstream& Cl::_rout(out); 

publicメンバを持つクラスのClを持っているしかし、私は、コンパイル・エラーがあります:違法定義または再定義を。 どうすれば修正できますか?

+2

[私のための作品](http://ideone.com/ujN6D)こと。失敗したコードと完全なエラーメッセージの完全な例を教えてください。 –

答えて

3

あなただけの静的/グローバルスコープ宣言(および初期化)された後の参照を再設定することはできません

#include<CL.h> 
ofstream& Cl::_rout(out); 
int main() { 
    // ... 
} 

に基準を設定することができます。あなたは後に、ポインタの代わりに参照を使用しているものを達成できます。

class Cl { 
    static std::ofstream* _rout; 
}; 
std::ofstream* CL::_rout = NULL; 

int main() { 
    ofstream out("output.txt"); 
    Cl::_rout = &out; 
} 

注意をoutがスコープの外に出るまでの間だけポインタが有効になること。これが問題である場合は、動的にメモリを割り当てる:

ofstream* out = new ofstream("output.txt"); 
    Cl::_rout = out; 

そして、あなたは、もはやメモリはまあ

0

をリークを避けるためにオブジェクトを必要とするときdeleteにそれを忘れてはいけません、あなたは以下のアプローチを使用することができます。

#include <fstream> 

class CI 
{ 
public: 
    static std::ofstream &_rout; 
}; 

static std::ofstream out("output.txt"); 

std::ofstream& CI::_rout = out; 

int main() 
{ 
} 

これに伴う問題は、しかし、(プログラムにハードコードされた)出力ファイル名が固定されていることです。

私はあなたの代わりに参照のポインタを使用することを示唆している:

#include <cstddef> 
#include <fstream> 

class CI 
{ 
public: 
    static std::ofstream *_rout; 
}; 

std::ofstream* CI::_rout = NULL; 

int main() 
{ 
    const char *output_file = "output.txt"; 
    std::ofstream out(output_file); 
    CI::_rout = &out; 
} 
関連する問題