Возможный дубликат:
Неопределенные символы «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 to
vtable для Pawn’`
со ссылкой на строку, где находится конструктор:
Pawn(char color) : Pieces(color) {}
Куда я иду не так?
Вы говорите, что реализовали последние две функции-члена. Я предполагаю, что вы не реализовали деструктор, который вы объявили, но не определили в классе.
Если вам нужен нетривиальный деструктор для класса, убедитесь, что вы его реализовали. Если нет, то удалите свою декларацию.
В общем, эта ошибка означает, что вы объявили не чистую виртуальную функцию и забыли ее реализовать; некоторые популярные компиляторы помещают полиморфные метаданные класса в ту же единицу перевода, что и первая не чистая, не встроенная функция-член, которая в данном случае является деструктором. Если вы видите ошибку для класса, который должен быть абстрактным, то это обычно означает, что вы забыли объявить некоторые из его виртуальных функций чистыми.
Других решений пока нет …