Невозможно создать экземпляр класса - PullRequest
2 голосов
/ 23 сентября 2011

У меня есть одноэлементный класс, который реализует два других абстрактных класса.

Мой monkey :: getMonkey терпит неудачу из-за thisMonkey = new monkey() возвращает "объект абстрактного класса типа" monkey "не разрешен".Я знаю, что вы не можете создавать экземпляры абстрактных классов, но моя обезьяна реализует два абстрактных класса (имеется в виду, что они не абстрактные .. верно?)

Какое решение для этого?

class monkey : public animal,
               public npc {
public:
    ~monkey();
    static monkey* getMonkey();

private:
    monkey();
    static monkey* thisMonkey;

}




monkey::monkey() {};

monkey::~monkey() {};

/* .. implements the virtual methods of animal and npc ... */

monkey::getMonkey() {
    if (!thisMonkey)
        thisMonkey = new monkey();
    return thisMonkey;
}

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

Вы не показываете достаточно, чтобы сказать точно, но априори, ваш класс monkey не реализует все чисто виртуальные функции в базовом классе. Класс, который имеет чисто виртуальные функции, которые не были переопределены, является абстрактным.

1 голос
/ 23 сентября 2011

Найдите все методы, объявленные чисто виртуальными в классах anmial и npc, и предоставьте для них реализации в классе обезьяны. Они являются базовыми классами класса обезьян, и кажется, что вы не выполнили их абстрактный интерфейс.

Чистые виртуальные классы выглядят так:

return_type methodName(params)=0;

Вы должны предоставить функцию в производном классе (обезьяна) с этим точным прототипом, с реализацией. Это будет вызвано, когда у вас есть указатель на один из производных классов, и вы вызываете эту «чисто-вирусную» функцию. * 1008 Т.е. *

 animal* aptr = new monkey;
 aptr->methodName(params);

отобразится на:

monkey::methodName
...