0

私は興味深いケースに出会いました:

クラスのメンバーとしてファイル ストリームがあり、ファイルにデータを書き込む関数があります。オブジェクトは、そのメンバーをパラメーターで初期化する別のクラスにパラメーターとして渡されます。このためにいくつかの問題がありましたが、文字列のベクトルとそれに行を追加することでそれらを解決することができました。しかし、今でもあるクラスから別のクラスにオブジェクトを渡していることがわかりました。

これが私が持っているものの例です:

class A
{
private:
   std::ofstream oFile;
   std::vector<std::string> oFileStringVec;
public:
   A()
   {
      oFile.open("../Path/File.txt", std::fstream::out);
      if (!oFile.is_open()) { std::cout<<"Error!!\n";}
   }
   ~A() {}

   void writeInfo(const std::string& s) 
   { oFileStringVec.push_back(s); }

   void closeFile()
   { oFile.close(); }
};

class B
{
private:
   A ma;
public:
   B(const A& aOb) : ma(aOb) {}

   void foo() 
   {
      // ...
      ma.writeInfo(mystr);
   }
   // ...
};

class C
{
private:
   A ma;
public:
   C(const A& aOb) : ma(aOb) {}
   // ...
   void foo()
   {
      // ...
      B myB(myA);
      //...
   }
};

foo()そして、C オブジェクトを作成してそのメソッドを呼び出す関数があります。

void bar()
{
   // ...
   A myA;
   // ...
   C myC(myA);
   myC.foo();
   //...
}

ここで何が起こっているのかよくわかりません。オブストリームは複数回作成されていますか? 一度だけ作成されてから、再び開かれますか? すべてのデストラクタにoFile.close()関数を追加するようにアドバイスしていただけますか? ベクトルのみをパラメーターとして渡し、関数内で ofstream を使用しbar()ますか?

4

2 に答える 2

1

ここで何が起こっているのかよくわかりません。オブストリームは複数回作成されていますか?

移動しました。参照からのように:

4) コンストラクターを移動します。最初に、(rdbuf() ポインターに影響を与えない) 他から基本クラスを移動構築し、次に std::basic_filebuf メンバーを移動構築し、次に this->set_rdbuf() を呼び出して、新しい basic_filebuf を rdbuf( としてインストールします。 ) 基本クラスのポインター。


一度だけ作成されてから、再び開かれますか?

最初のポイントを参照してください。

すべてのデストラクタに oFile.close() 関数を追加するようにアドバイスしていただけますか?

それはすでにstd::ofstreamデストラクタで自動的に行われています

ベクトルだけをパラメーターとして渡し、bar() 関数だけで ofstream を使用しますか?

上記の回答がユースケースの結果として何をもたらすかはわかりません。

于 2014-03-22T14:51:46.660 に答える