简单地不要定义这个:
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
现在假设,无论出于何种原因,我不希望类的用户使用orA
创建对象,幸运或不幸的是,这些对象可以隐式转换为,那么您可以将它们禁用为: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&)'