2013-12-03 2 views
0

Я пытаюсь скомпилировать старый код, который должен был работать с наследованием 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 (ИНТ а, б, ИНТ Операция * ор) {

что:

ошибка: нет функции согласования для вызова «Operation :: операции()»

Я удивлен, потому что это выглядит как его проверка для конструктора по умолчанию Oper ция. Если я перегружаю конструктор по умолчанию, он работает, но я не понимаю, почему. Не важно, передаю ли я операцию по значению или ссылке. Можете ли вы дать мне несколько намеков на эту функциональность? Я не смог найти последовательный ответ. Пожалуйста, проигнорируйте следующие ошибки, когда я работаю над ними.

Все самое лучшее.

ответ

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.

+0

Понял. Мощный ответ. Большое спасибо. – Alex

+0

+1, но я не думаю, что сам конструктор копирования будет улучшением. 'Operation' - это базовый класс' Param', и OP почти наверняка захочет сохранить объекты 'Param' в' operation'. Вероятно, умный тип указателя будет лучшим выбором, который не обязательно должен делать копию '* op'. – hvd

+0

Я использую Code :: Blocks как свою IDE, потому что он предоставляет много компиляторов, но во время выполнения я получаю: mingw32-g ++. Exe -o bin \ Release \ Tests.exe obj \ Release \ Exec.o -s c:/программные файлы/кодовые блоки/mingw/bin /../ lib/gcc/mingw32/4.7.1 /../../../ libmingw32.a (main.o): main.c :(. text.startup + 0xa7): неопределенная ссылка на 'WinMain @ 16 ' collect2.exe: ошибка: ld возвращен 1 статус выхода Процесс завершен со статусом 1 (0 минут, 0 секунд) 1 ошибка, 0 предупреждений (0 минут, 0 секунд) – Alex

Смежные вопросы