您好我用VS2010在c ++中实现了单例模式,编译器给我一个错误!!
#ifndef __EgEngine__
#define __EgEngine__ 1
#include <esUtil.h>
#include <stdlib.h>
#include <EgGpuManager.h>
class EgEngine
{
public:
EgEngine();
static EgGpuManager GetGpuManager();
~EgEngine();
void EgInit();
private:
EgEngine(const EgEngine &other){};
EgEngine* operator = (const EgEngine &other)const {};
static EgGpuManager GpuManager; // Return this !!
ESContext esContext;
};
#endif
另一个班级
#ifndef __EgGpuManager__
#define __EgGpuManager__ 1
#include <EgBuffer.h>
#include <EgProgram.h>
class EgGpuManager
{
public:
EgBuffer* GetBuffer();
EgProgram* GetNewProgram();
private:
EgGpuManager();
~EgGpuManager();
EgBuffer buffer;
};
#endif
当我尝试编译时,我有这个错误:
1>EgEngine.obj : error LNK2001:
unresolved external symbol "private: static class
EgGpuManager EgEngine::GpuManager" (?GpuManager@EgEngine@@0VEgGpuManager@@A)
请帮助我,谢谢。
答案 0 :(得分:4)
static EgGpuManager GpuManager; // Return this !!
这个人必须在你的C ++代码中的某个地方实例化。
static
类成员必须出现在全局范围内,因此在C ++文件中添加:
EgGpuManager EgEngine::GpuManager
。
顺便说一句,你有一个EgGpuManager
类的私有构造函数,在这种情况下这将是一个问题,因为它是由EgEngine
创建的。你没有正确实现单身人士。使用static EgGpuManager *EgGpuManager::Get()
方法返回一个实例,它将在第一次调用时实例化该类,然后您可以使用私有构造函数来实现。否则请将它们friend
s。
答案 1 :(得分:0)
行“static EgGpuManager GpuManager;”在EgEngine的类声明中只是一个声明:你说这个对象将存在于某个地方。链接器抱怨它没有找到任何对象。要解决此问题,请在其中一个源文件(全局范围)中放置实例化:
EgGpuManager EgEngine::GpuManager;
答案 2 :(得分:0)
您必须将单例对象的实例化放在全局范围内,如其他答案所示,或者像GetGpuManager()
这样实现:
EgGpuManager& EgEngine::GetGpuManager()
{
static EgGpuManager GpuManager;
return GpuManager;
}
在这种情况下,您需要从类定义中删除GpuManager的声明。另请注意&amp;返回一个引用,因为你当然不希望返回一个对象的副本(这会破坏制作单例的目的)。这里的优点是在第一次调用GetGpuManager()
之前不会创建对象,而在程序启动时会创建全局范围内的所有静态。