猿问

未定义的符号“ vtable for…”和“ typeinfo for ...”?

几乎是最后一步,但仍然有些奇怪。


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是什么意思?


温温酱
浏览 1037回答 3
3回答

慕斯王

如果Obstacle是抽象的基类,请确保将其所有虚拟方法声明为“纯虚拟”:virtual void Method() = 0;该= 0告诉编译器,这个方法必须重写由派生类,可能不会有它自己的实现。如果该类包含任何非纯虚函数,则编译器将假定它们在某处具有实现,并且其内部结构(vtable和typeinfo)可能与其中的一个在同一目标文件中生成;如果未实现这些功能,则内部结构将丢失,并且您会得到这些错误。

智慧大石

障碍类需要一个虚拟的析构函数。将析构函数定义更改为:virtual ~Obstacle();析构函数的定义还会为具有虚函数的类创建vtable。它还确保通过基类指针删除派生类实例的操作正确。
随时随地看视频慕课网APP
我要回答