Singleton模式c++错误

Singleton pattern c++ error

本文关键字:错误 c++ 模式 Singleton      更新时间:2023-10-16

Hi我用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)

请帮帮我,谢谢。

static EgGpuManager GpuManager; // Return this !!这个家伙必须在C++代码中的某个地方实例化。

static类成员必须出现在全局作用域中,因此在C++文件中添加:

EgGpuManager EgEngine::GpuManager

顺便说一下,您有一个EgGpuManager类的私有构造函数,在这种情况下这将是一个问题,因为它是由EgEngine创建的。您没有正确实现singleton。使用static EgGpuManager *EgGpuManager::Get()方法返回一个实例,它将在第一次调用时实例化类,然后您可以使用私有构造函数来执行此操作。否则使其成为friend s。

EgEngine的类声明中的"static EgGpuManager-GpuManager;"一行只是一个声明:你说这个对象将存在于某个地方。链接器抱怨在任何地方都找不到对象。要解决此问题,请将实例化放在一个源文件中(全局范围内(:

EgGpuManager EgEngine::GpuManager;

您必须将singleton对象的实例化放在全局范围中,正如其他答案所建议的那样,或者放在GetGpuManager()的实现中,如下所示:

EgGpuManager& EgEngine::GetGpuManager()
{
  static EgGpuManager GpuManager;
  return GpuManager;
}

在这种情况下,您需要从类定义中删除GpuManager的声明。还要注意&返回引用,因为您肯定不想返回对象的副本(这将破坏创建singleton的目的(。这里的优点是,在第一次调用GetGpuManager()之前不会创建对象,而全局范围内的所有静态都是在程序启动时创建的。