c ++在对象组合上使用重载构造函数

时间:2013-11-10 05:27:03

标签: c++ constructor-overloading

我可以知道如何在另一个类中使用重载构造函数进行对象组合,这是一个示例代码:

class A {
    int a;

    A( int inputA ) { a = inputA; }
};

class B {
    A objectA;

    B( A inputObjectA ) { objectA = inputObjectA; }
};

编译器的错误是没有默认构造函数A :: A()?

有没有办法编辑B的构造函数的参数中的代码来接受A中的重载构造函数?

4 个答案:

答案 0 :(得分:2)

如果一个孩子没有默认构造函数,那么父的构造函数应该传递参数。

class A {
public:
    int a;
    A( int inputA ) { a = inputA; }
};

class B {
    A objectA;
public:
    B( A inputObjectA ): objectA(inputObjectA.a) { }
};

http://ideone.com/QavhfY

在您的情况下,为A使用复制构造函数是合适的,而不是将其成员公开:

class A {
    int a;
public:
    A( int inputA ) { a = inputA; }
};

class B {
    A objectA;
public:
    B(A inputObjectA ): objectA(inputObjectA) { }
};

http://ideone.com/wX1clr

答案 1 :(得分:1)

在您的B类对象中

A objectA;

这是在调用默认构造函数时,所以在那里你需要有一个指定的默认构造函数,或者你也可以使用默认参数,例如

A( int inputA = 0 ) { a = inputA; }

这将把设置为整数a的角色设为0,当你调用默认构造函数时,它实际上会实现与

相同
A() { a = 0; } 

虽然 如果你不想设置a,你不必设置一个,但是由于你声明了一个非默认的构造函数,它不再为你隐式创建一个。所以你至少需要

A(){ }  

另一种方法是

class A {
    int a;
    void setSomething(int val) { a = val; }
};

class B {
    A objectA;
    B( A inputObjectA ) { objectA = inputObjectA; }
};

这是有效的,因为你从未声明过任何构造函数,所以它会隐式为你创建一个默认构造函数

最后,这是你可以做到的另一种方式,可能最接近原始代码,只添加了3个字符,应修复所有内容:

class A {
    int a;

    A( int inputA ) { a = inputA; }
};

class B {
    A objectA(0);

    B( A inputObjectA ) { objectA = inputObjectA; }
};

答案 2 :(得分:0)

只需将A()的参数传递给B()的构造函数即可。 此解决方案适用于A,它既不是默认构造的,也不是复制或移动可构造/可分配的。

class A 
{
    int a;

    // Just to demonstrate non copy-move-ness (can be removed)
    A() = delete;
    A( A& ) = delete;
    A( A&& ) = delete;
    A& operator=( A& ) = delete;
    A& operator=( A&& ) = delete;
public:
    A( int inputA ): a(inputA ) {}
};

class B 
{
    A objectA;
public:
    B( int inputA ): objectA(inputA ) { }
};


int main() 
{
    B(42);
}

Proof

提示:不要在构造函数体中使用赋值,而是使用构造函数init列表。

您可以从any modern C++ book获得所有这些信息。

答案 3 :(得分:-1)

你需要一个默认的构造函数,因为你在类B中有一个类A的实例。如果你读一下有关调用构造函数的顺序,你会发现首先有成员调用默认构造函数,并且然后是主类构造函数。所以 - 在你的例子中 - 首先编译器尝试使用默认值初始化objectA,并且失败,因为没有默认构造函数。