2

多くのファイル io 操作を使用して、C++ でプログラムを開発しています。プロジェクトのどこからでもアクセスできるように、共通ヘッダーで静的な ofstream を定義しました。コードの構造は次のとおりです。すべての共通変数は com.h で定義され、test.h と test.cpp は OPClass と呼ばれるクラス用であり、main.cpp はメイン プログラムを実行します。

COM.H:

#ifndef __CLCOM__
#define __CLCOM__
#include <sstream>
#include <fstream>
#include <iostream>

using namespace std;

static ofstream out;
static stringstream ss;

#endif

TEST.H:

#ifndef __CL__
#define __CL__
#include <iostream>
#include <fstream>
#include "com.h"

using namespace std;

class OPClass
{
  public:
   void run(void);
   void show(ostream &o) const;
};
#endif

テスト.CPP:

#include "com.h"
#include "test.h"

void OPClass::run(void)
{
  out << "Here is run()" << endl;
  show(out);
}

void OPClass::show(ostream &o) const
{
  o << "hello!" << endl;
}

メイン.CPP:

#include "com.h"
#include "test.h"

void runmain(void)
{
  OPClass op;
  out.open("output.txt", ios::out | ios::trunc);
  out << endl << "State changed!" << endl;
  op.run();
  if (out.is_open()) out.close();
}

int main(int argc, char* argv[])
{
  runmain();
  return  0;
}

ご覧のとおり、静的な ofstream は out という名前で、メイン プログラムとクラスで呼び出されます。私は mingw32 を使用していますが、コンパイル時または実行時に問題は見られませんでした。しかし、runmain() の情報だけが出力ファイルに書き込まれるようです。クラス内のそのファイルに書き込まれた他のメッセージは、出力ファイルには表示されません。それはなぜですか?また、プロジェクトのどこからでもアクセスできるように、共通のファイル ストリームを作成するにはどうすればよいですか? ありがとう。

4

2 に答える 2

3

各コンパイル単位は、独自のssandを取得していoutます。したがって、test.cpp とは異なるインスタンスが main.cpp で見られます。

ここでは static は必要ありません。これに対処するには、ヘッダー ファイルで変数とその割り当てを宣言するのではなく、externキーワードを使用して単にプロトタイプを作成する必要があります。

#ifndef __CLCOM__
#define __CLCOM__
#include <sstream>
#include <fstream>
#include <iostream>

// Note: don't put "using" statements in headers
// use fully qualified names instead 
extern std::ofstream out;
extern std::stringstream ss;

#endif

宣言を実際にどこに置くかはあなた次第ですが、それが 1 か所だけであることを確認してください。それは com.cpp ファイルである可能性があり、プロジェクトに適している場合は main.cpp に貼り付けることもできます。

std::ofstream out;
std::stringstream ss;

とにかく、このようなグローバル変数は良い考えではありません...

于 2012-04-21T04:47:12.523 に答える
1

予防措置: @HostileFork の回答を受け入れる必要があります。

補足として、何が起こっているかを示す簡単な方法は、out使用しようとするたびに のアドレスを出力することです。

これらのカップル ステートメントを追加すると、次のようになります。

void OPClass::run(void)
{
  cout << "Address of 'out' = " << &out << endl;
  out << "Here is run()" << endl;
  show(out);
}

と:

void runmain(void)
{
  cout << "Address of 'out' = " << &out << endl; 
  OPClass op;
  out.open("output.txt", ios::out | ios::trunc);
  out << endl << "State changed!" << endl;
  op.run();
  if (out.is_open()) out.close();
}

out2 つの print ステートメントが2 つの異なるアドレスを表示していることに気付くでしょう。outこれは、 createdの 2 つのインスタンスを 2 つの異なる変数として実際に取得していることを示しています。あなたのメソッドはOPClass、まったく異なる出力ストリームに書き込もうとしています。これはstatic、グローバル コンテキストで使用している方法に関係しています。あなたが思うように動作しません。グローバル コンテキストでは、何かを宣言staticすると、それが含まれるファイルのローカル スコープにバインドされます。

于 2012-04-21T04:54:09.847 に答える