我正在尝试编译一个我必须使用C ++继承的旧代码。我已经修了一段时间,但我投降了这个错误:
class Operation{
public:
char *op;
//Operation();
Operation(char op[]){
(*this).op = op;
}
};
class Param : Operation{
public:
int value;
Param(char op[], int value) : Operation(op){
(*this).op=op;
(*this).value=value;
}
int getValue(){
return this->value;
}
};
class MyBase{
public:
int valuea;
int valueb;
Operation operation;
MyBase(int a, int b, Operation* op){
valuea=a;
valueb=b;
operation=*op;
}
Operation* getSum(){};
Operation* getRest(){};
};
class MyExtend : public MyBase{
public:
Param* getSum(){
Param pam=new Param(this->valuea+this->valueb,"add");
return pam;
}
Param* getRest(){
Param pam=new Param(this->valuea-this->valueb,"rest");
return pam;
}
};
class Exec{
public int static main(args[] params){
MyExtend ext=new MyExtend(6,4);
cout << ext.getSum().getValue() << endl;
cout << ext.getRest().getValue() << endl;
return 0;
}
};
我专注于
的错误MyBase(int a,int b,Operation * op){
即:
错误:没有匹配函数来调用'Operation :: Operation()'
我很惊讶,因为它看起来像检查操作的默认构造函数。如果我重载默认构造函数它的工作原理,但我不明白为什么。如果我通过值或引用传递Operation无所谓。你能给我一些关于这个功能的提示吗?我无法找到一致的回复。请在我正在处理它们时忽略以下错误。
一切顺利。
答案 0 :(得分:4)
MyBase
包含名为operation
的成员,其类型为Operation
且既不是指针也不是引用,因此成员必须在MyBase
时由编译器构造是建造的。该成员未在MyBase
构造函数的(不存在的)初始化列表中初始化,因此编译器将尝试默认构造它;但是,Operation
没有默认构造函数,因此错误。
一个可能的解决方法是重写MyBase
的构造函数以使用初始化列表,如下所示:
class MyBase
{
public:
int valuea;
int valueb;
Operation operation;
MyBase(int a, int b, Operation* op)
: valuea(a)
, valueb(b)
, operation(*op) { }
};
但是请注意 - 就目前而言 - 这将依赖于默认(即编译器提供的)复制构造函数,它可能无法执行您想要的操作,因此您应该提供一个显式的复制ctor。