これまでの回答を要約し、さらに追加すると、いくつかの解決策が考えられます。
1基本クラスにメンバーのアクセサーがある場合は、かなり簡単です。
DerrivedClass::DerrivedClass()
: BaseClass(new SomeParamType()),
derrivedClassMember(getBaseClassMember()),
{
...
}
2 C++ 11 では、委譲コンストラクターを使用して、投稿した元のコンストラクターを呼び出します。
DerrivedClass::DerrivedClass()
: DerrivedClass(new SomeParamType())
{}
3 C++03 では、デフォルトの引数を使用します (これは醜いです):
DerrivedClass::DerrivedClass(SomeParamType* p = new SomeParamType())
: BaseClass(p),
derrivedClassMember(p),
{
...
}
4 C++03 でコンストラクターの既定の引数を取り除く別の回避策は、多重継承を使用してderivedclassMember
、基本クラスの前に初期化されたものを取得することです。
struct DerivedClassInitializationWorkaround {
SomeParamType* derivedClassMember:
DerivedClassInitializationWorkaround(SomeParamType* param)
: derivedClassMember(param) {}
};
class DerivedClass : private DerivedClassInitializationWorkaround, //this has to go first!
public BaseClass {
public:
DerivedClass::DerivedClass()
: DerivedClassInitializationWorkaround(new SomeParamType())
, BaseClass(derivedClassMember)
{}
};
基本クラスの初期化は宣言の順序で行われるため、 から派生する場合、DerivedClassInitializationWorkaround
含まderivedClassMember
れている が最初に初期化されます。
いずれにせよ、コードは例外セーフではありません。所有ポインターを生のポインターとして保存するのではなく、スマート ポインターを使用する必要があります。基本クラスは変更できないため、オブジェクトの所有権を取得するかどうか (つまり、コンストラクターに渡したオブジェクトを破棄するかどうか) を判断する必要があります。
基本クラス オブジェクトが所有権を取得する場合、派生クラスがポインターの代わりに参照を格納する必要があることを除いて、多かれ少なかれ既存のソリューションに固執しSomeParamType
ます。
基本クラスが所有権を取得しない場合は、次を保存する必要がありますunique_ptr
。
class DerivedClass : public BaseClass {
unique_ptr<SomeParamType> derivedClassMember;
DerivedClass::DerivedClass(unique_ptr<SomeParamType> param)
: BaseClass(param.get())
, derivedClassMember(move(param))
{}
public:
DerivedClass::DerivedClass()
: DerivedClass(make_unique<SomeParamType>)
{}
};