Singleton模式c++错误
Singleton pattern c++ error
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()
之前不会创建对象,而全局范围内的所有静态都是在程序启动时创建的。
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 在某些循环内使用vector.push_back时出现分段错误
- MSVC多行宏编译器错误
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 错误:未在此范围内声明'reverse'