C++ c++;在对象组合中使用重载构造函数

C++ c++;在对象组合中使用重载构造函数,c++,constructor-overloading,C++,Constructor Overloading,我想知道如何在另一个类中使用重载构造函数进行对象合成,下面是一个示例代码: class A { int a; A( int inputA ) { a = inputA; } }; class B { A objectA; B( A inputObjectA ) { objectA = inputObjectA; } }; 编译器的错误是没有默认构造函数A::A() 有没有办法编辑B的构造函数参数中的代码,以接受B类对象中A的重载构造函数? A object

我想知道如何在另一个类中使用重载构造函数进行对象合成,下面是一个示例代码:

class A {
    int a;

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

class B {
    A objectA;

    B( A inputObjectA ) { objectA = inputObjectA; }
};
编译器的错误是没有默认构造函数A::A()


有没有办法编辑B的构造函数参数中的代码,以接受B类对象中A的重载构造函数?

A objectA;
这就是调用默认构造函数的时候,因此在这里您需要指定一个默认构造函数,或者您也可以使用默认参数,例如

A( int inputA = 0 ) { a = inputA; }
然后,这个角色将把整数a设置为0,当您调用默认构造函数时,它将真正实现与

A() { a = 0; } 
虽然 如果不想,您不必设置构造函数,但由于您声明了非默认构造函数,它不再隐式地为您创建构造函数。因此,您至少需要

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

如果子级没有默认构造函数,则父级构造函数应传递参数

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

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

在您的情况下,最好为使用副本构造函数,而不是将其成员公开:

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

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

您需要一个默认构造函数,因为在类B中有一个类a的实例。如果您阅读了一些有关调用构造函数的顺序的信息,您会注意到,首先是为成员调用默认构造函数,然后是主类构造函数。因此,在您的示例中,编译器首先尝试使用默认值初始化
objectA
,但失败了,因为没有默认构造函数。

只需将
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);
}

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


您可以从中获得所有这些信息。

是否有任何方法可以编辑B的构造函数参数中的代码,以接受A中的重载构造函数。此外,当您为类定义构造函数时,默认构造函数不会被调用。错误不是来自那里,而是来自
A ObjectA
,因此此行应更改为HI,为了让您的解决方案正常工作,我必须在类a中有一个默认构造函数,所以无论发生什么,我都需要一个默认构造函数?如果没有,则
B(A inputObjectA):objectA(inputObjectA){}
将触发未找到的默认构造函数在我的解决方案中没有A的默认构造函数。不,不会有编译器错误。我添加了到ideone的链接,以证明代码编译良好。感谢您的解释,但是我的案例研究需要B接受a类对象而不引用。我已删除引用。它们只是有助于避免额外的副本。Oops,一个被C++11拒绝的构造函数:(在这种情况下,有一种方法可以将参数传递给非默认构造函数。B构造函数应该进行修改才能这样做。请参阅我的答案。错误。即使成员是按值传递的,默认构造函数也没有绝对必要。虽然你们都说的是真的,但在我为其提供答案时,问题的内容不同。用户没有询问“如何更改bode”,但“我是否需要默认构造函数”。因此,虽然将代码更改为使用初始值设定项列表是一个好主意,但原始问题的答案是“是的,您需要它,因为…”。使用构造函数初始值设定项列表。