1

こんにちは私は2つのクラスを持っています。1つはInstructionと呼ばれ、もう1つは命令クラスから継承する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);
    }
};

次に、Instruction型のポインターを作成し、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&)
4

4 に答える 4

8

コード:具体的には、「aと。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
}
于 2009-11-15T06:09:27.643 に答える
3
LDI::LDI (string _name, int _value):Instruction(_name,_value){}

派生クラスのコンストラクターを提供する必要がありますLDI。これにより、正しいBaseクラスコンストラクターが呼び出されます。

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){}
于 2009-11-15T06:10:20.603 に答える
1

基本クラスのコンストラクタ、デストラクタ、代入演算子、フレンド関数、およびフレンドクラスは、派生クラスに継承されません。

于 2009-11-15T06:34:28.057 に答える
0

何よりもまず、LDIのコンストラクター(string _name、int _value)を定義して宣言する必要があります。基本クラスのコンストラクターもLDI::LDI(string _name、int _value):Instruction(_name、_value){}で初期化する必要があります。次に、基本クラスのデストラクタの前にvritualキーワードを追加するとよいでしょう。基本クラスのデストラクタが仮想ではなく、このコードを記述した場合、Instruction * ptr; ptr = new LDI( "test"、22); *ptrを削除します。

LDIのデストラクタは呼び出されませんでした。オブジェクトの階層を正しく破棄するために、基本クラスのデストラクタを仮想に保ちます

于 2009-11-15T09:24:09.687 に答える