1

public メンバーを持つクラス Cl があります

static std::ofstream &_rout;

メインファイル内

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

しかし、コンパイル エラーがあります: 無効な定義または再定義です。どうすれば修正できますか?

4

3 に答える 3

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;   

deleteそして、メモリリークを避けるために、オブジェクトが不要になったときにそれを忘れないでください

于 2012-04-17T15:39:57.500 に答える
0

さて、次のアプローチを使用できます。

#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;
}
于 2012-04-17T15:40:52.057 に答える