在另一个类中声明一个带有非默认构造函数的类

时间:2012-07-05 16:02:45

标签: c++ constructor

我该如何实现这种行为?

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

我想知道除了我找到的答案之外是否有其他方法可以完成这项工作。

5 个答案:

答案 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构造函数在运行时(显然需要删除)