49

ほぼ最終ステップですが、まだ奇妙なエラーがいくつかあります....

bash-3.2$ make
g++ -Wall -c -g Myworld.cc
g++ -Wall -g solvePlanningProblem.o Position.o AStarNode.o PRM.o PRMNode.o World.o SingleCircleWorld.o Myworld.o RECTANGLE.o CIRCLE.o -o solvePlanningProblem
Undefined symbols:
  "vtable for Obstacle", referenced from:
      Obstacle::Obstacle()in Myworld.o
  "typeinfo for Obstacle", referenced from:
      typeinfo for RECTANGLEin RECTANGLE.o
      typeinfo for CIRCLEin CIRCLE.o
ld: symbol(s) not found
collect2: ld returned 1 exit status
make: *** [solvePlanningProblem] Error 1

vtable と typeinfo の意味は何ですか?

4

5 に答える 5

95

Obstacleが抽象基本クラスである場合は、そのすべての仮想メソッドを「純粋仮想」として宣言していることを確認してください。

virtual void Method() = 0;

= 0、このメソッドを派生クラスでオーバーライドする必要があり、独自の実装がない可能性があることをコンパイラーに通知します。

クラスに純粋でない仮想関数が含まれている場合、コンパイラはそれらがどこかに実装されていると想定し、その内部構造(vtableおよびtypeinfo)はそれらの1つと同じオブジェクトファイルに生成される可能性があります。これらの関数が実装されていない場合、内部構造が失われ、これらのエラーが発生します。

于 2009-11-07T17:31:54.653 に答える
8

Obstacle クラスには仮想デストラクタが必要です。デストラクタの定義を次のように変更します。

virtual ~Obstacle();

デストラクタの定義は、仮想関数を持つクラスの vtable も作成します。また、基本クラス ポインターを介した派生クラス インスタンスの削除が正しく行われることも保証されます。

(質問への私の回答のコピーこの奇妙なエラーをどうすればいいですか?これは重複しているようです。)

于 2009-11-08T00:08:43.910 に答える
4

ファイルはありObstacle.ccますか?Obstacle.oその場合、それが に組み込まれていることを確認する必要があります。これObstacle.oは、プログラムをリンクするときにコマンド ラインに追加されます。

また、宣言するすべての非純粋仮想メソッドを必ず定義してください。純粋仮想デストラクタを宣言する場合は、それも定義する必要があります。

于 2009-11-07T17:00:39.053 に答える