我正在为程序编写一个小插件系统。它的某些部分已经完成,加载文件并调用构造函数。
在其中一个函数中,我需要将一些(类)指针传递回处理程序,这就是我遇到seg-fault的地方。
程序中的:
class RenderInterface {
public:
RenderInterface();
virtual ~RenderInterface();
void RegisterBufferInterface(BufferInterface* interface)
{
bInterface = interface; // <---- this is where segfault occurs
}
void RegisterCameraInterface(CameraInterface* interface){}
void RegisterRenderInterface(RenderInterface* interface){}
static RenderInterface* GetSingletonPtr()
{
return _singleton;
}
private:
static RenderInterface* _singleton;
BufferInterface* bInterface;
CameraInterface* cInterface
RenderInterface* rInterface;
};
RenderInterface :: _ singleton在其他地方设置为0。
注册函数中的(在dll中):
class BInterface : public BufferInterface {
public:
... various stuff ....
}
class GLPlugin : public Plugin {
public:
Plugin() : bInterface(0) {}
~Plugin(){}
void Initialize() // <--- is called after dll has been loaded
{
bInterface = new BInterface();
InterfaceManager::GetSingletonPtr()->RegisterBufferInterface(bInterface); // segfault
// register other stuff
}
private:
BufferInterface* bInterface;
};
我错过了什么工作?还有其他办法吗?
编辑:在简化代码的同时错过了BufferInterface之后的*,感谢Luchian
答案 0 :(得分:3)
嗯,它崩溃了,因为你永远不会初始化你的单身人士:
static RenderInterface* GetSingletonPtr()
{
return _singleton;
}
我假设你在实现文件中初始化_singleton
到NULL
,在这种情况下你需要:
static RenderInterface* GetSingletonPtr()
{
if ( !_singleton )
_singleton = new RenderInterface;
return _singleton;
}
其他一些提示:
private
吗?bInterface = new BInterface();
是非法的,因为bInterface
是一个对象,而不是一个指针。