我可以知道如何在另一个类中使用重载的构造函数进行对象组合,这是一个示例代码:
class A {
int a;
A( int inputA ) { a = inputA; }
};
class B {
A objectA;
B( A inputObjectA ) { objectA = inputObjectA; }
};
编译器的错误是没有默认构造函数 A::A() ?
有没有办法编辑B的构造函数的参数中的代码以接受A中的重载构造函数?
我可以知道如何在另一个类中使用重载的构造函数进行对象组合,这是一个示例代码:
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()
's 参数传递给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);
}
提示:不要在构造函数主体中使用赋值,而是使用构造函数初始化列表。
您可以从任何现代 C++ 书籍中获得所有这些信息。
您需要一个默认构造函数,因为您在类 B 中有一个类 A 的实例。如果您阅读了一些关于调用构造函数的顺序的内容,您会注意到首先为成员调用默认构造函数,然后是主构造函数。类构造函数。所以 - 在你的例子中 - 首先编译器尝试objectA
使用默认值进行初始化,但它失败了,因为没有默认构造函数。