如果未实现,则为抽象类类型分配对象,如果声明和定义,则丢失vtable错误

时间:2012-08-13 06:43:44

标签: c++ vtable

我必须继承一个有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)
{
}

2 个答案:

答案 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)覆盖;