2012-08-13 25 views
-1

我必須繼承具有5個虛函數的抽象基類。如果我沒有實現這5個函數,我會得到「如果未實現,爲抽象類類型分配一個對象」。如果未實現,爲abstact類類型分配對象,如果聲明並定義了缺少vtable錯誤

當我宣佈在派生類中實現我得到 「爲i386硬件架構未定義的符號: ‘虛函數表的debugDrawer’,從引用:在debugDrawer.o 注意 debugDrawer :: debugDrawer():缺少虛函數表通常意味着第一個非內聯虛擬成員函數沒有定義。「從子彈物理庫

類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

在我看來,你的'drawAabb'實現(和其他幾個人)缺少'debugDrawer ::'符。 – DCoder 2012-08-13 06:52:24

+1

這些函數是虛擬函數,用於避免「爲抽象類類型分配對象」。我已經實現了我想的所有功能。它是空的,但確實有一個定義 – 2012-08-13 09:38:33

+0

不,你實現了具有相同名稱的全局函數,而不是類成員函數。請參閱[maxbc的答案](http://stackoverflow.com/a/11931617/1233508)。 – DCoder 2012-08-13 09:45:03

回答

1

不要忘記你的drawContactPoint()定義:它是vtable的第一個函數(參見btIDebugDraw的定義)並且沒有定義,所以缺少vtable(如說明所述)。

void debugDrawer::drawContactPoint(...) {} 

代替

void drawContactPoint(...) {} 

你會再拿到正常的未實現功能錯誤,你將不得不重複這些更改的所有其他職能。

+0

感謝它適用於我..很高興得到一個快速回復 – 2012-08-13 10:12:17

0

保持virtual在開始和結尾添加override,所以你的函數映射到子彈物理宣佈的,如:從,常量btVector3 &

虛擬無效的drawLine(常量btVector3 & to,const btVector3 & color)override;