-1

5 つの仮想関数を持つ抽象基本クラスを継承する必要があります。これらの 5 つの関数を実装しないと、「実装されていない場合、抽象クラス タイプのオブジェクトを割り当てています」というメッセージが表示されます。

派生クラスで宣言して実装すると、「アーキテクチャ i386 の未定義シンボル: "debugDrawer の vtable"、参照元: debugDrawer::debugDrawer() in debugDrawer.o 注: vtable が見つからない場合は、通常、最初の非インライン仮想メンバーを意味します。関数には定義がありません。」

class btIDebugDraw- Bullet Physics ライブラリの基本クラスは次のとおりです。

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)
{
}
4

2 に答える 2

1

定義のクラス仕様を忘れないでくださいdrawContactPoint(): これは vtable の最初の関数 ( の定義を参照btIDebugDraw) であり、定義がないため、vtable がありません (メモにあるように)。

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

それ以外の

void drawContactPoint(...) {}

その後、通常の実装されていない関数のエラーが発生し、他のすべての関数に対してこれらの変更を繰り返す必要があります。

于 2012-08-13T09:37:16.573 に答える
0

最初に保持virtualし、最後に追加することoverrideで、次のような Bullet Physics で宣言された関数に関数がマップされます。

virtual void drawLine(const btVector3 &from, const btVector3 &to, const btVector3 &color) override;

于 2017-01-26T17:38:31.610 に答える