質問

次のコードはからです ここ:

#include <streambuf>  // for std::streambuf
#include <ostream>    // for std::ostream

class fdoutbuf
    : public std::streambuf
{
public:
    explicit fdoutbuf( int fd );
    //...
};

class fdostream
    : public std::ostream
{
protected:
    fdoutbuf buf;
public:
    explicit fdostream( int fd ) 
        : buf( fd ), std::ostream( &buf ) // This is not allowed. 
                                          // buf can't be initialized before std::ostream.
        {}
    //...
};

私はコメントを本当に理解していませんでした。どうして 「bufはstd :: ostreamの前に初期化できません」?これを理解するのに役立ちますか?

役に立ちましたか?

解決

初期化の順序は、クラスメンバーを宣言する順序によって決定され、そのすべての前に継承されたクラスが来ます。継承を参照せずに基本的な問題を示す簡単な例を挙げてください。

class C
{
  int a, b;
public:
  C() : b(1), a(b) {} // a is initialized before b!
};

コードはあなたが思うことをしません! Aは最初に初期化され、次にBは1つに初期化されます。したがって、それは初期化リストの順序ではなく、宣言の順序に依存します。

int a, b;

これで、派生クラスのメンバーの前に初期化される基本クラスにも同じアイデアが適用されます。この問題を解決するために、基本クラスから初期化するメンバーを含む本質的なクラスを作成します。もちろん、そのヘルパークラスは、あなたが実際に派生しているものの前に来なければなりません。

他のヒント

メンバー変数を初期化する前にベースクラスのコンストラクターを呼び出す必要がありますが、このコンストラクターにポインター(この時点で未定義のメンバー変数)にポインターを渡します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top