我有一个名为A
的课程。
它有一个实例或B
:
public:
B inst;
B
的构造函数就像B::B(int, int)
。
创建A
类的构造函数A::A() { }
时,它会给我以下错误:
No matching function for call to B::B()
,当我没有在A
的构造函数中创建或提及任何B时。有什么想法吗?
答案 0 :(得分:3)
构造A
需要构建所有A
的数据成员。在这种情况下,B
必须是默认构造的,因为您没有提供成员初始化列表。当B
定义非默认构造函数时,它的隐式默认构造函数的生成被抑制 - 这就是你得到错误的原因。
答案 1 :(得分:1)
当班级A
包含班级B
的实例时,构建A
的实例也需要构建包含B
的实例。
如果B
的初始化中没有列出A
的构造函数,则缺省情况是调用不接受任何参数的B
构造函数。例如
class A
{
public:
A::A() {};
private:
B b;
};
在功能上等同于
class A
{
public:
A::A() : b() {};
private:
B b;
};
这涉及B
的构造函数,没有参数。如果不存在此类构造函数,则结果为诊断(错误消息)。由于您已使用参数声明/定义了构造函数,因此不会隐式生成不带参数的B
构造函数。