public メンバーを持つクラス Cl があります
static std::ofstream &_rout;
メインファイル内
ofstream out("output.txt");
ofstream& Cl::_rout(out);
しかし、コンパイル エラーがあります: 無効な定義または再定義です。どうすれば修正できますか?
静的/グローバルスコープでのみ参照を設定できます
#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;
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;
}