您好我有两个类,一个称为指令,一个叫LDI从指令类继承。

class Instruction{

  protected:
    string name;
    int value;

  public:
    Instruction(string _name, int _value){ //constructor
        name = _name;
        value = _value;
    }
    ~Instruction(){}
    Instruction (const Instruction &rhs){
        name = rhs.name;
        value = rhs.value;
    }
    void setName(string _name){
        name = _name;
    }
    void setValue(int _value){
        value = _value;
    }
    string getName(){
        return name;
    }
    int getValue(){
        return value;
    }
    virtual void execute(){}
    virtual Instruction* Clone() { 
        return new Instruction(*this); 
    }
};
/////////////end of instruction super class //////////////////////////

class LDI : public Instruction{

    void execute(){
        //not implemented yet
    }
    virtual Instruction* Clone(){
        return new LDI(*this);
    }
};

然后,我创建类型的指令的指针,并设法使指向型LDI的新实例。

Instruction* ptr;
ptr = new LDI("test", 22);

我得到以下编译器错误。任何想法我做错了吗?

functions.h:71: error: no matching function for call to ‘LDI::LDI(std::string&, int&)’
classes.h:54: note: candidates are: LDI::LDI()
classes.h:54: note:                 LDI::LDI(const LDI&)
有帮助吗?

解决方案

代码:new LDI(name, val)特别说 “调用LDI构造与nameval。”

没有LDI构造函数name / val。 事实上,我没有看到LDI在所有的构造函数。

如果你想使用一个基类的构造函数,方法如下:

public LDI(string _name, int _value) // Public constructor for LDI
    : Instruction(_name, _value)     // Delegate to the base-class constructor
{
    // Do more LDI-specific construction here
}

其他提示

LDI::LDI (string _name, int _value):Instruction(_name,_value){}

您需要为派生类LDI,后者又调用正确的基类构造提供一个构造函数。

ptr = new LDI("test", 22);

此时编译器查找一个LDI构造这需要(string,int)作为参数,由于不存在这样的构造提供编译器婴儿床。

LDI(string _name, int _value)
{ 
}

通过提供派生类的构造将解决编译问题。但是默认情况下,派生类的构造函数不会调用相应的基类的构造函数;在这种情况下Instruction(_name,_value)(它只调用默认的构造函数)。 为了正确调用基类的构造函数,你需要调用由派生类初始化列表的基类的构造函数。

如此。

LDI::LDI (string _name, int _value):Instruction(_name,_value){}

构造,析构函数,赋值运算符,朋友的功能和基础类的类朋友不是由派生类继承。

所有的杉杉必须定义和LDI声明构造(字符串_name,INT _value)。你神秘岛初始化基类的构造也LDI :: LDI(字符串_name,INT _value):指令(_name,_value){}。 其次,如果你的基类的析构函数前加vritual关键字这将是很好。如果你的基类的析构函数不是虚拟的,你写的代码 指令* PTR; PTR =新LDI( “测试”,22); 删除* PTR;

为LDI析构函数不会被调用。保底类的析构虚正确摧毁你的对象的层次结构

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top