Ошибка компоновщика из неопределяемой ссылки абстрактного класса на `vtable for

Возможный дубликат:
Неопределенные символы «vtable for…» и «typeinfo для…»?
C ++ Undefined Ссылка на vtable и наследование

У меня проблема с небольшим проектом, который требуется от моего университета.
Это простой проект шахматной игры.

У меня неясная ошибка неопределенная ссылка на `vtable для XXX
когда я определяю унаследованный класс от абстрактного …
Это код

Pieces.h

class Pieces {
public:
Pieces(char color) : pieceColor(color) {}
virtual ~Pieces() {}
virtual char getPieceType() = 0;
char getColor() {
return pieceColor;
}

virtual bool isLegalMove(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]) = 0;

private:
virtual bool areSquaresLegal(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]) = 0;
char pieceColor;
};

и это образец унаследованного класса, то есть пешка

Pawn.h

#include "Pieces.h"
class Pawn: public Pieces {
public:
Pawn(char color) : Pieces(color) {}
~Pawn();
private:
virtual char getPieceType() {
return 'P';
}
bool areSquaresLegal(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]);
bool isLegalMove(int srcRow, int srcCol, int destRow, int destCol, Pieces* board[8][8]);
};

Последние два метода реализованы в файле .cpp.
Любой другой класс похож на пешку.

Когда я пытаюсь скомпилировать, строитель дает мне: undefined reference tovtable для Pawn’`
со ссылкой на строку, где находится конструктор:

Pawn(char color) : Pieces(color) {}

Куда я иду не так?

5

Решение

Вы говорите, что реализовали последние две функции-члена. Я предполагаю, что вы не реализовали деструктор, который вы объявили, но не определили в классе.

Если вам нужен нетривиальный деструктор для класса, убедитесь, что вы его реализовали. Если нет, то удалите свою декларацию.

В общем, эта ошибка означает, что вы объявили не чистую виртуальную функцию и забыли ее реализовать; некоторые популярные компиляторы помещают полиморфные метаданные класса в ту же единицу перевода, что и первая не чистая, не встроенная функция-член, которая в данном случае является деструктором. Если вы видите ошибку для класса, который должен быть абстрактным, то это обычно означает, что вы забыли объявить некоторые из его виртуальных функций чистыми.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]