在其他类构造函数

时间:2016-11-17 21:31:53

标签: c++ constructor instance-variables default-constructor

我担心这是一个非常基本的问题,但是,我还没能解决它。

我有class A

// classA.h
...

class ClassA {
    public:
        ClassA();
        ClassA(int foo);
    private:
        int _foo;

    ...

}

// classA.cpp

ClassA::ClassA() {
    _foo = 0;
}

ClassA::ClassA(int foo) {
    _foo = foo;
}

...

第二个class B在构造函数中使用class A的实例:

// classB.h
...

#include "classA.h"

#define bar 5

class ClassB {
    public:
        ClassB();
    private:
        ClassA _objectA;

    ...

}

// classB.cpp

ClassB::ClassB() {
    _objectA = ClassA(bar);
}

...

请注意,永远不会使用class A的默认构造函数。事实上,在我的真实世界用例中,使用任何类型的默认构造函数都没有意义,因为_foo必须动态分配。

但是,如果删除默认构造函数,编译器将返回错误:

  

没有用于调用'ClassA :: ClassA()'

的匹配函数

有没有办法在class A中使用class B实例作为对象而不定义class A的默认构造函数?怎么会这样做?

2 个答案:

答案 0 :(得分:3)

使用ClassA的默认构造函数。 ClassB' _objectA已初始化,然后您将ClassA(bar)分配给它。

您可以使用constructor initializer lists

解决问题
ClassB::ClassB() : _objectA(bar)
{}

答案 1 :(得分:3)

只需写下

ClassB::ClassB() :  _objectA(bar)
{
}

问题在于,当执行ClassB的构造函数的主体时,数据成员_objectA已经构造并且在主体内部使用了复制赋值运算符

ClassB::ClassB() {
    _objectA = ClassA(bar);
   ^^^^^^^^^^^^^^^^^^^^^^^^
}

因此,您可以删除ClassA

的默认构造函数