gpt4 book ai didi

C++虚函数。vtable问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:34:51 25 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
GCC C++ Linker errors: Undefined reference to 'vtable for XXX', Undefined reference to 'ClassName::ClassName()'

我正在用 C++ 做一个小项目,我遇到了一些关于虚函数的问题。

我有一个带有一些虚函数的基类:

#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_ */

和一个 SphereShape 类,它扩展了 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.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 版本 4.6.0 20110530 (Red Hat 4.6.0-9) (GCC)

稍后编辑:真的很抱歉,我在这里直接手写了代码。我已经在代码中定义了返回类型。我向下面回答的 2 个人道歉。

我必须指出,我是使用 C++ 中更复杂的项目布局的初学者。我指的是更复杂的 makefile、共享库等类似的东西。


我的问题是因为我没有定义 virtual void CollisionShape::GetSceneNode() 的主体。

解决这个问题的方法是定义上面的函数,或者将其声明为纯虚函数:

virtual void CollisionShape::GetSceneNode() = 0;

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com