繁体   English   中英

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

[英]c++ Using overloaded constructor on object composition

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

class A {
    int a;

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

class B {
    A objectA;

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

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

有什么方法可以编辑B的构造函数参数中的代码以接受A中的重载构造函数?

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

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

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

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

证明

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

您可以从任何现代C ++书中获得所有这些信息。

您需要一个默认的构造函数,因为您在类B内有一个类A的实例。如果您对调用构造函数的顺序有所了解,您会注意到,首先是成员的默认构造函数,然后是成员的默认构造函数。类的构造函数。 因此,在您的示例中,首先,编译器尝试使用默认值初始化objectA ,但由于没有默认构造函数,因此编译器失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM