单例模式c ++错误

时间:2011-07-29 17:47:00

标签: c++ singleton design-patterns

您好我用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)

请帮助我,谢谢。

3 个答案:

答案 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()之前不会创建对象,而在程序启动时会创建全局范围内的所有静态。