尝试构建时遇到两组错误:
(在第一次构建时)
In constructor 'aa::aa(int)':
no matching function for call to 'bb:bb()'
candidates are: bb::bb(int)
bb:bb(const bb&)
(然后我再次点击构建并获得以下内容)
file not recognized: File truncated... takes me to assembly
collect2:ld returned 1 exit status
#ifndef BB_H
#define BB_H
class bb
{
public:
bb(int _m);
int m;
};
#endif // BB_H
#ifndef AA_H
#define AA_H
#include "AA/bb.h"
class aa : bb
{
public:
aa(int _i);
int i;
int j;
};
#endif // AA_H
#include "bb.h"
bb::bb(int _m)
{
m = _m * 5;
}
#include "aa.h"
aa::aa(int _i)
{
i = _i;
j = i + 1;
}
答案 0 :(得分:3)
In constructor 'aa::aa(int)':
no matching function for call to 'bb:bb()'
编译器的权利。您没有默认构造函数。即使您没有编写默认构造函数,编译器也会为您编写默认构造函数,但如果您有任何用户定义的构造函数,则不会发生这种情况。
您有两个选择:
首先,实现默认构造函数:
class bb
{
public:
bb(int _m);
bb();
int m;
};
bb:bb()
{
}
这可能很严重,因为您将如何初始化m
?
其次,使用初始化列表调用aa
构造函数中的转换构造函数:
aa::aa(int _i)
:
bb (_i)
{
i = _i;
j = i + 1;
}
答案 1 :(得分:0)
在创建派生类对象时调用基类构造函数。
在你的例子中,你必须创建一个类aa的对象,因为类bb是它的基类,编译器会搜索bb类的默认构造函数。由于您已创建参数化构造函数,因此它不会提供导致错误的任何默认构造函数
没有匹配函数调用bb()。
要克服该错误,要么在类bb中提供默认构造函数,如
bb::bb()
{
}
或
在aa构造函数初始化列表中,只需调用类bb参数化构造函数,如下所示
aa::aa(int i):bb(int x)
{
}
我在这里做的是,我刚刚在初始化派生类的数据成员之前初始化了基类的数据成员,并且编译器期望相同。