まず、これが悪い質問である場合はお詫び申し上げます。私はC++が初めてです。
インターフェイス (純粋仮想関数から構築されたクラス) である参照型フィールドを含む一連のクラス ヘッダーがあります。クラスを初期化して、デフォルトで参照型フィールドが特定の「具体的な」派生クラスに設定されるようにしたいと思います。これは、デフォルトのコンストラクター (パラメーターなし!) を使用して行われます。また、この初期化を別の「具体的な」派生クラスでオーバーライドできるようにしたいと考えています。
これまでのところ、次のようなクラス ヘッダーがあります。
class Foo {
public:
Foo();
Foo(IBar & bar);
protected:
/* Update 1: const field */
const IBar & bar;
...
}
しかし、私は実装に苦労しています:
/* Is it possible to create the reference type through the initialisation list? */
/* Update 2: corrected initialisation of bar field from "BarDerivedA() bar" to "BarDerivedA()" */
Foo::Foo()
: bar(BarDerivedA())
{
}
/* Override */
Foo::Foo(IBar & bar)
: bar(bar)
{
}
更新
この潜在的な設計を使用しても効率的ではないことがわかりました。のデフォルトconst IBar & bar
は、ほとんどの場合、フィールドを持つすべてのクラスで同じオブジェクトになりますが、ユニット テストは例外です。必要に応じてモック クラスを交換できるようにしたいと考えています。
スタック上に同じオブジェクトを常に作成したくないので、これらのオブジェクト グループのファクトリで作業します。
次のように、単一のコンストラクターのルートをたどりました。
Foo::Foo(IBar & bar)
: bar(bar)
{
}
誰かが初期化リストの一時オブジェクトへのクラス参照フィールドの設定に関する適切な回答を提供したい場合 (つまり、const フィールドに対してのみ行うことができ、コンストラクターの外側の範囲外になります)、私はそれを次のようにマークします。受け入れられた答え。または、適切な複製としてマークします。