我怎样才能实现这种行为?
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;
}
我想知道除了我找到的答案之外,是否还有另一种方法可以使这项工作。
我怎样才能实现这种行为?
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;
}
我想知道除了我找到的答案之外,是否还有另一种方法可以使这项工作。
不,这是正确的解决方案。您明确声明您不希望在A
没有参数的情况下进行初始化,所以这个结果不应该让您感到惊讶。
或提供默认值x
:
class A
{
int x;
public:
A(int x = 1) : x(x) {}
};
使其成为默认构造函数。
向 A 添加第二个默认构造函数:
class A
{
int x;
public:
A(int x) : x(x) {}
A() : x(1) {}
};
是的,在 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
我确定您已经知道这一点,但是您可以使“a”成为指向 A 类型对象的指针:这将允许您控制何时实例化对象,从而可以在运行时将什么值传递给 A 构造函数(显然需要删除)
您应该记住,当您显式添加一个构造函数时,不会自动创建默认构造函数。它只是一个默认构造函数。将创建复制构造函数。
还要记住三法则:
三规则(也称为三巨头或三巨头)是 C++ 中的一条经验法则,它声称如果一个类定义了以下之一,它可能应该明确定义所有三个 [1]:
destructor
copy constructor
copy assignment operator
>