是否将对象作为参数传递时调用的构造函数?

时间:2013-12-03 23:35:34

标签: c++ constructor parameter-passing

我正在尝试编译一个我必须使用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无所谓。你能给我一些关于这个功能的提示吗?我无法找到一致的回复。请在我正在处理它们时忽略以下错误。

一切顺利。

1 个答案:

答案 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。