[英]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) { }
};
在您的情况下,将复制构造函数用于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( 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.