我该如何实现这种行为?
class A
{
int x;
public:
A(int x) : x(x) {}
};
class B
{
A a; // here is the problem
public:
B() : a(1) {} // solution i found
};
int main(void)
{
B b;
return 0;
}
我想知道除了我找到的答案之外是否有其他方法可以完成这项工作。
答案 0 :(得分:4)
没有。这是正确的解决方案。您明确声明您不希望它可以在没有参数的情况下初始化A
,所以这个结果不应该让您感到惊讶。
或提供x
的默认值:
class A
{
int x;
public:
A(int x = 1) : x(x) {}
};
使其成为默认构造函数。
答案 1 :(得分:2)
将第二个默认构造函数添加到A:
class A
{
int x;
public:
A(int x) : x(x) {}
A() : x(1) {}
};
答案 2 :(得分:2)
是的,在C ++ 11中,你可以这样写:
class B
{
A a(1); //C++11 support this! (though the compilers may not, now)
public:
B() {} //nothing here!
};
或者这个,
A a{1}; //using uniform initialization
答案 3 :(得分:0)
您应该记住,当您显式添加一个构造函数时,将不会自动创建默认构造函数。它只是一个默认构造函数。将创建复制构造函数。
还要记住三条规则:
三规则(也称为三巨头或三巨头的规则)是C ++中的经验法则,声称如果一个类定义了下面的一个,它应该明确地定义所有三个[1] :
destructor
copy constructor
copy assignment operator
>
答案 4 :(得分:0)
我确定你已经知道了这一点,但你可以使“a”指向A类型的对象:这将允许你控制对象何时被实例化,从而可以将什么值传递给A构造函数在运行时(显然需要删除)