C ++のベースからメンバーのIdiom
-
25-10-2019 - |
質問
次のコードはからです ここ:
#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;
これで、派生クラスのメンバーの前に初期化される基本クラスにも同じアイデアが適用されます。この問題を解決するために、基本クラスから初期化するメンバーを含む本質的なクラスを作成します。もちろん、そのヘルパークラスは、あなたが実際に派生しているものの前に来なければなりません。
他のヒント
メンバー変数を初期化する前にベースクラスのコンストラクターを呼び出す必要がありますが、このコンストラクターにポインター(この時点で未定義のメンバー変数)にポインターを渡します。
所属していません StackOverflow