単にこれを定義しないでください:
B():host(A()) {} // This is ugly and not needed !!
つまり、以下はあなたがやりたいことをするはずです:
class B {
B(const A& a): host(a) {}
private:
//B():host(A()) {} // This is ugly and not needed !!
const A& host;
};
パラメーターを受け取るコンストラクターを定義した場合、デフォルトのコンストラクターはコンパイラーによって生成されないという考え方です。つまり、上記のクラスのインスタンスをデフォルトで作成することはできません。
B b1; //error - needs default constructor which doesn't exist!
B b2(a); //ok - only way to create an instance!
C++11ソリューション
C ++ 11では、次のように特定のコンストラクターを生成しないようにコンパイラーに明示的に指示できます。
struct B
{
B(const A &a) {}
B() = delete; //disable
};
それだけでなく。以下で説明するように、それ以上のものがあります。
今興味深い部分
選択したタイプのコンストラクターを選択的に無効にすることもできます。これにより、さらに面白くdelete
なります。このことを考慮、
struct A
{
A (int) {}
};
このクラスのオブジェクトは、int
引数だけでなく、暗黙的にに変換される任意の型で作成できますint
。例えば、
A a1(10); //ok
A a2('x'); //ok - char can convert to int implicitly
B b;
A a3(b); //ok - assume b provides user-defined conversion to int
ここで、何らかの理由で、クラスのユーザーがまたはA
を使用してオブジェクトを作成したくないとします。これは、幸運にも不幸にも暗黙的にに変換でき、次のように無効にできます。char
class B
int
struct A
{
A(int) {}
A(char) = delete; //disable
A(const B&) = delete; //disable
};
今ここに行きます:
A a1(10); //ok
A a2('x'); //error
B b;
A a3(b); //error - assume (even if) b provides user-defined conversion to int
オンラインデモ: http: //ideone.com/EQl5R
エラーメッセージは非常に明確です。
prog.cpp:9:5:エラー:削除された関数'A :: A(char)'
prog.cpp:10:5:エラー:削除された関数'A :: A(const B&)'