【发布时间】:2017-12-25 21:24:32
【问题描述】:
我有一个名为A 的课程。
它有一个实例或B:
public:
B inst;
B 的构造函数类似于B::B(int, int)。
创建A 类的构造函数A::A() { } 时,出现以下错误:
B::B()的调用没有匹配的函数
当我没有在A 的构造函数中创建或提及任何 B 时。有什么想法吗?
【问题讨论】:
标签: c++
我有一个名为A 的课程。
它有一个实例或B:
public:
B inst;
B 的构造函数类似于B::B(int, int)。
创建A 类的构造函数A::A() { } 时,出现以下错误:
B::B()的调用没有匹配的函数
当我没有在A 的构造函数中创建或提及任何 B 时。有什么想法吗?
【问题讨论】:
标签: c++
构造A 需要构造A 的所有数据成员。在这种情况下,B 必须是默认构造的,因为您没有提供成员初始化列表。由于 B 定义了一个非默认构造函数,其隐式默认构造函数的生成被抑制 - 这就是您收到错误的原因。
【讨论】:
当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 的构造函数。
【讨论】: