1

我怎样才能实现这种行为?

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;
}

我想知道除了我找到的答案之外,是否还有另一种方法可以使这项工作。

4

5 回答 5

4

不,这是正确的解决方案。您明确声明您不希望在A没有参数的情况下进行初始化,所以这个结果不应该让您感到惊讶。

或提供默认值x

class A
{
    int x;
public:
    A(int x = 1) : x(x) {}
};

使其成为默认构造函数。

于 2012-07-05T16:04:08.890 回答
2

向 A 添加第二个默认构造函数:

class A
{
    int x;
public:
    A(int x) : x(x) {}
    A() : x(1) {}
};
于 2012-07-05T16:05:18.953 回答
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
于 2012-07-05T16:09:21.633 回答
0

我确定您已经知道这一点,但是您可以使“a”成为指向 A 类型对象的指针:这将允许您控制何时实例化对象,从而可以在运行时将什么值传递给 A 构造函数(显然需要删除)

于 2012-07-05T16:20:52.660 回答
0

您应该记住,当您显式添加一个构造函数时,不会自动创建默认构造函数。它只是一个默认构造函数。将创建复制构造函数。

还要记住三法则:

三规则(也称为三巨头或三巨头)是 C++ 中的一条经验法则,它声称如果一个类定义了以下之一,它可能应该明确定义所有三个 [1]:

destructor
copy constructor
copy assignment operator

>

于 2012-07-05T16:12:46.960 回答