我必须继承一个有5个虚函数的抽象基类。如果我没有实现这5个函数,我会得到“如果没有实现,则为abstact类类型分配一个对象”。
当我在派生类中声明并实现时,我得到了 “架构i386的未定义符号: “vtable for debugDrawer”,引自: debugDrawer.o中的debugDrawer :: debugDrawer() 注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。“
子弹物理库中的类btIDebugDraw-基类如下class btIDebugDraw
{
virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color)=0;
virtual void reportErrorWarning(const char* warningString) = 0;
virtual void draw3dText(const btVector3& location,const char* textString) = 0;
virtual void setDebugMode(int debugMode) =0;
virtual int getDebugMode() const = 0;
virtual void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color)
}
派生类debugDrawer.h
class debugDrawer : public btIDebugDraw{
public:
debugDrawer();
void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color);
void reportErrorWarning(const char* warningString);
void draw3dText(const btVector3& location,const char* textString);
void setDebugMode(int debugMode);
int getDebugMode() const;
void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color);
void drawLine(const btVector3& from,const btVector3& to,const btVector3& color);
};
派生类debugDrawer.mm文件(我使用的是目标c,所以它的.mm文件)
debugDrawer::debugDrawer(){
}
void debugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& color)
{
float tmp[ 6 ] = { from.getX(), from.getY(), from.getZ(),
to.getX(), to.getY(), to.getZ() };
glPushMatrix();
{
glColor4f(color.getX(), color.getY(), color.getZ(), 1.0f);
glVertexPointer( 3,
GL_FLOAT,
0,
&tmp );
glPointSize( 5.0f );
glDrawArrays( GL_POINTS, 0, 2 );
glDrawArrays( GL_LINES, 0, 2 );
}
glPopMatrix();
}
void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color){
}
void reportErrorWarning(const char* warningString) {
}
void draw3dText(const btVector3& location,const char* textString) {
}
void setDebugMode(int debugMode){
}
int getDebugMode() {
return 0;
}
void drawAabb(const btVector3& from,const btVector3& to,const btVector3& color)
{
}
答案 0 :(得分:1)
不要忘记drawContactPoint()
定义中的类规范:它是vtable的第一个函数(参见btIDebugDraw
的定义)并且没有定义,因此缺少vtable(作为注释)说)。
void debugDrawer::drawContactPoint(...) {}
而不是
void drawContactPoint(...) {}
然后,您将获得正常的未实现函数错误,并且您必须对所有其他函数重复这些更改。
答案 1 :(得分:0)
将virtual
保留在开头,并在末尾添加override
,这样您的函数就会映射到Bullet Physics中声明的函数,例如:
virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color)覆盖;