Pergunta

Olá, tenho duas aulas, uma chamada instrução, uma chamada LDI que herda da aula de instrução.

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);
    }
};

Em seguida, crio um ponteiro de instrução de tipo e tento destacar uma nova instância do tipo LDI.

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

Recebo os seguintes erros do compilador. Alguma idéia do que estou fazendo de errado?

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&)
Foi útil?

Solução

O código: new LDI(name, val) diz especificamente "ligue para o construtor LDI com um name e val."

Não há construtor LDI que toma name / val. Na verdade, não vejo um construtor para o LDI.

Se você deseja usar o construtor de uma classe base, aqui está como:

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
}

Outras dicas

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

Você precisa fornecer um construtor para aula derivada LDI, que por sua vez chama o construtor de classe base correto.

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

Neste momento, o compilador procura um LDI construtor que leva (string,int) Como argumentos, como não existe esse construtor, desde que os berços do compilador.

LDI(string _name, int _value)
{ 
}

Ao fornecer o construtor de classe derivado, resolverá a questão da compilação. Mas, por padrão, o construtor de classe derivado não chamará o construtor de classe base apropriado; nesse caso Instruction(_name,_value)(Ele chama apenas o construtor padrão). Para ligar para o construtor de classe base correto, você precisa invocar o construtor da classe base da lista inicial de inicializador de classe derivada.

assim.

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

Construtores, destruidores, operador de tarefas, funções de amigos e classes de amizade de classes base não são herdadas por classes derivadas.

FIRS de tudo o que você deve definir e declarar construtor para LDI (String _name, int _value). Você inicializa seu construtor de classe base também ldi :: ldi (string _name, int _value): Instrução (_name, _value) {}. Segundo, será bom se adicione a palavra -chave vritual antes do seu destruidor de classe base. Se o seu destruidor de classe base não é virtual e você escrever esta instrução de código* ptr; ptr = novo ldi ("teste", 22); excluir *ptr;

Destrutor para o LDI nunca ligou. Mantenha o destruidor da classe base virtual para destruir correto para sua hierarquia de objetos

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top