6

重複の可能性:
未定義のシンボル「vtable for …」と「typeinfo for…」?
C++ 未定義の vtable と継承への参照

大学から要求された小さなプロジェクトに問題があります。これは、チェス ゲームの単純なプロジェクトです。

抽象クラスから継承されたクラスを定義すると、あいまいなエラー undefined reference to `vtable for 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]);
};

最後の 2 つのメソッドは、.cpp ファイルに実装されています。他のすべてのクラスは明らかにポーン 1 に似ています。

コンパイルしようとすると、ビルダーはundefined reference to、コンストラクターがある行を参照して、vtable for Pawn'` を提供します。

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

どこが間違っていますか?

4

1 に答える 1

8

最後の 2 つのメンバー関数を実装したとします。私の推測では、宣言したデストラクタを実装していませんが、クラスで定義していません。

クラスに自明でないデストラクタが必要な場合は、必ず実装してください。そうでない場合は、その宣言を削除します。

一般に、このエラーは、非純粋仮想関数を宣言し、それを実装するのを忘れたことを意味します。一部の一般的なコンパイラは、クラスのポリモーフィック メタデータを、最初の非純粋で非インラインのメンバー関数 (この場合はデストラクタ) と同じ翻訳単位に配置します。抽象クラスであるはずのクラスのエラーが表示される場合は、通常、その仮想関数の一部を純粋に宣言するのを忘れていることを意味します。

于 2012-09-14T11:29:22.203 に答える