と仮想functions.Problem私はC++で少しプロジェクトをやっていると私は仮想関数に関するいくつかの問題に来ています。C++のvtable
私はいくつかの仮想関数を持つ基本クラスがある:
#ifndef COLLISIONSHAPE_H_
#define COLLISIONSHAPE_H_
namespace domino
{
class CollisionShape : public DominoItem
{
public:
// CONSTRUCTOR
//-------------------------------------------------
// SETTERS
//-------------------------------------------------
// GETTERS
//-------------------------------------------------
virtual void GetRadius() = 0;
virtual void GetPosition() = 0;
virtual void GetGrowth(CollisionShape* other) = 0;
virtual void GetSceneNode();
// OTHER
//-------------------------------------------------
virtual bool overlaps(CollisionShape* shape) = 0;
};
}
#endif /* COLLISIONSHAPE_H_ */
とCollisionShape
を拡張し
/* SphereShape.h */
#ifndef SPHERESHAPE_H_
#define SPHERESHAPE_H_
#include "CollisionShape.h"
namespace domino
{
class SphereShape : public CollisionShape
{
public:
// CONSTRUCTOR
//-------------------------------------------------
SphereShape();
SphereShape(CollisionShape* shape1, CollisionShape* shape2);
// DESTRUCTOR
//-------------------------------------------------
~SphereShape();
// SETTERS
//-------------------------------------------------
void SetPosition();
void SetRadius();
// GETTERS
//-------------------------------------------------
void GetRadius();
void GetPosition();
void GetSceneNode();
void GetGrowth(CollisionShape* other);
// OTHER
//-------------------------------------------------
bool overlaps(CollisionShape* shape);
};
}
#endif /* SPHERESHAPE_H_ */
と.cppファイル上記の方法を実装SphereShape
クラス:
/*SphereShape.cpp*/
#include "SphereShape.h"
#define max(a,b) (a>b?a:b)
namespace domino
{
// CONSTRUCTOR
//-------------------------------------------------
SphereShape::SphereShape(CollisionShape* shape1, CollisionShape* shape2)
{
}
// DESTRUCTOR
//-------------------------------------------------
SphereShape::~SphereShape()
{
}
// SETTERS
//-------------------------------------------------
void SphereShape::SetPosition()
{
}
void SphereShape::SetRadius()
{
}
// GETTERS
//-------------------------------------------------
void SphereShape::GetRadius()
{
}
void SphereShape::GetPosition()
{
}
void SphereShape::GetSceneNode()
{
}
void SphereShape::GetGrowth(CollisionShape* other)
{
}
// OTHER
//-------------------------------------------------
bool SphereShape::overlaps(CollisionShape* shape)
{
return true;
}
}
これらのクラスは、他のクラスに沿って、共有クラスにコンパイルされます。 としょうかん。
Building libdomino.so
g++ -m32 -lpthread -ldl -L/usr/X11R6/lib -lglut -lGLU -lGL -shared -lSDKUtil -lglut -lGLEW -lOpenCL -L/home/adrian/AMD-APP-SDK-v2.4-lnx32/lib/x86 -L/home/adrian/AMD-APP-SDK-v2.4-lnx32/TempSDKUtil/lib/x86 -L"/home/adrian/AMD-APP-SDK-v2.4-lnx32/lib/x86" -lSDKUtil -lglut -lGLEW -lOpenCL -o build/debug/x86/libdomino.so build/debug/x86//Material.o build/debug/x86//Body.o build/debug/x86//SphereShape.o build/debug/x86//World.o build/debug/x86//Engine.o build/debug/x86//BVHNode.o
私はこのライブラリを使用するコードをコンパイルすると、私は次のエラーを取得する:コマンドは、ライブラリを使用して、デモのコンパイルに使用
../../../lib/x86//libdomino.so: undefined reference to `vtable for domino::CollisionShape'
../../../lib/x86//libdomino.so: undefined reference to `typeinfo for domino::CollisionShape'
:
g++ -o build/debug/x86/startdemo build/debug/x86//CMesh.o build/debug/x86//CSceneNode.o build/debug/x86//OFF.o build/debug/x86//Light.o build/debug/x86//main.o build/debug/x86//Camera.o -m32 -lpthread -ldl -L/usr/X11R6/lib -lglut -lGLU -lGL -lSDKUtil -lglut -lGLEW -ldomino -lSDKUtil -lOpenCL -L/home/adrian/AMD-APP-SDK-v2.4-lnx32/lib/x86 -L/home/adrian/AMD-APP-SDK-v2.4-lnx32/TempSDKUtil/lib/x86 -L../../../lib/x86/ -L"/home/adrian/AMD-APP-SDK-v2.4-lnx32/lib/x86"
を(-ldomino
フラグ)
デモを実行すると、手動でライブラリは:
LD_LIBRARY_PATH=../../lib/x86/:$AMDAPPSDKROOT/lib/x86:$LD_LIBRARY_PATH bin/x86/startdemo
仮想関数および仮想テーブルについて少し読んだ後、私は、仮想テーブルは、コンパイラによって処理されていることを理解し、私はそれを心配してはならないので、私は方法についての少し混乱していますこの問題を処理します。私はgcc version 4.6.0 20110530 (Red Hat 4.6.0-9) (GCC)
後に編集を使用してい
: 私は本当に申し訳ありませんが、私はここで直接手でコードを書きました。 コードで戻り値の型を定義しました。 下記の2人にお詫び申し上げます。
私はC++でより複雑なプロジェクトレイアウトを使用する際の初心者ですが、これはもっと複雑なmakefile、共有ライブラリ、そのようなものです。
私の問題は、私はvirtual void CollisionShape::GetSceneNode()
の本体を定義していないという事実によって引き起こされました。
この問題を解決する方法は上記の関数を定義する、またはのような仮想純粋なそれを宣言するかのいずれかである:
virtual void CollisionShape::GetSceneNode() = 0;
どのようにリンクしていますか? – nullpotent
@adivasile:問題をコンパイルして示す最小スニペットを投稿してください。あなたが戻り値の型を持たないという問題を解決しようとしたとき、関数が返す型を逆にしました。実際のシナリオとは何の関係もない赤ん坊の群れがあるときに、エラーを診断することは時折困難です。ライブラリを使用するコードのコマンドラインも指定してください。エラーが表示される場所です。 –
@Michael Burr:ライブラリをリンクするコードを追加しました。スニペットでは、かなりのファイルや依存関係が存在するため、私が提供できるかどうかはわかりません。 – adivasile