2

C++ では、 (ファイルから自分自身をロードする)Aを受け入れるコンストラクターを持つオブジェクトがあります。メンバーとしてistreamを持つ別のクラスがあります。をまだ開いていないため、初期化リストから のコンストラクターをA呼び出すことができません。クラスのコンストラクターで開くと、のコンストラクターを呼び出すには遅すぎます。のコンストラクターに送信できるように、初期化リストの を一時オブジェクトに開く方法はありますか? もしあれば、初期化リストが呼び出される順序に何らかの保証があり、 の前に初期化されますか?AistreamAistreamA
istreamA

例が役立つ場合があります。

class A {
public:
  A(std::istream const&);
}

class B {
public:
  B(std::istream const&);
}

class MyClass {
  A a;
  B b;
public:
  MyClass() : a(is), b(is) {  // <-- How to do this?
    std::istream is("path");
  }
}
4

5 に答える 5

2

両方のメンバーが同じ istream に依存する必要があるため、次の理由はありません。

class A {
public:
  A(std::istream const&);
}

class B {
public:
  B(std::istream const&);
}

class MyClass {
  A a;
  B b;
public:
  MyClass(std::istream const& is) : a(is), b(is) {
  }
}
于 2012-07-05T12:29:56.937 に答える
2

代わりにオブジェクトへのポインターを使用します。

class MyClass {
   A *a;
   B *b;
public:
   MyClass()
   {
       std::istream is("path");
       a = new A(is);
       b = new B(is);
   }
}

デストラクタでメモリを解放することを忘れないでください。

于 2012-07-05T12:02:59.650 に答える
2

ここにさらに別のアイデアがあります...動的割り当てを避け、単一の一時的なを使用したい場合は、コンストラクターistreamのロードフェーズを移動してコンストラクターから離すAことができます。B

class A {
public:
  Load(std::istream const&);
}

class B {
public:
  Load(std::istream const&);
}

class MyClass {
  A a;
  B b;
public:
  MyClass() {
    std::istream is("path");
    a.Load(is);
    b.Load(is);
  }
}

これは、ところで、共有された親から負荷能力を呼び出してA継承Bしますが、それは明らかにこの質問の範囲を超えています。

于 2012-07-05T12:30:56.163 に答える
1

クラスのメンバー変数の初期化は、クラス宣言で指定した順序で行われます。

初期化子リストの順序がメンバー変数の宣言の順序と一致しない場合、gcc は (-Wall を指定すると) 警告を発することに注意してください。クラス内の宣言順序は信頼できます。

クラスA {
公衆:
    A(std::istream const&);
}

クラスB {
公衆:
  B(std::istream const&);
}

クラス MyClass {
  std::istream は;
  ああ;
  B b;
公衆:
  MyClass() : is("パス"), a(は), b(は) {
  }
}
于 2012-07-05T12:21:39.760 に答える
1

多分私は何かが欠けているかもしれませんが、何が問題なのですか:

class MyClass {
    A* a;
    B* b;
public:
    MyClass() {
      std::istream is("path");
      a = new A(is);
      b = new B(is);
    }

    ~MyClass() {
        delete a;
        delete b;
    }
}
于 2012-07-05T12:03:12.593 に答える