2015-05-31 1 views
1

Пусть у меня есть:как я выделяю указатель класса с множественным наследованием

class Human { 
    string choice; 
public: 
    Human(string); 
}; 

class Computer { 
    string compChoice; 
public: 
    Computer(string); 
}; 

class Refree : public Human, public Computer { 
public: 
    string FindWinner(); 
}; 

int main() { 
    Human* H1 = new Human("name"); 
    Computer* C1 = new Computer("AI"); 
    Refree* R1 = new Refree(); 
} 

Этот код не компилировать с:

In function 'int main()': 
error: use of deleted function 'Refree::Refree()' 
note: 'Refree::Refree()' is implicitly deleted because the default definition would be ill-formed: 
error: no matching function for call to 'Human::Human()' 
note: candidates are: 
note: Human::Human(std::string) 
note: candidate expects 1 argument, 0 provided 

Почему это не так, и как я могу построить указатель на Refree?

ответ

3

С Human и Computer имеют объявленные пользователем конструкторы, которые принимают аргумент, их конструкторы по умолчанию неявно удаляются. Чтобы их построить, вам нужно дать им аргумент.

Однако вы пытаетесь построить Refree без каких-либо аргументов, который неявно пытается построить все его базы без каких-либо аргументов. Это невозможно. Установка делает в сторону того или нет смысла что-то, чтобы быть одновременно Human и Computer, по крайней мере, вы должны сделать что-то вроде:

Refree() 
: Human("human name") 
, Computer("computer name") 
{ } 

Скорее всего, вы хотите, чтобы обеспечить конструктор, который принимает один или оба названия, например:

Refree(const std::string& human, const std::string& computer) 
: Human(human) 
, Computer(computer) 
{ }