我正在尝试为来自各种类的游戏数据的集中访问点编写单例类。这就是我所拥有的...现在只是通用的。
- > Singleton.h
#pragma once
class Singleton {
public:
static Singleton* instance;
static Singleton* Get();
private:
Singleton() {};
};
Singleton* Singleton::Get() {
instance = new Singleton();
return instance;
}
- >在main.cpp中,我尝试调用Singleton类
#include "Singleton.h"
Singleton* single = Singleton::Get();
- >我在MS Visual Studio中收到以下错误
LNK2001未解析的外部符号“public:static class Singleton * Singleton :: instance”(?instance @ Singleton @@ 2PAV1 @ A)TimePilot84 E:\ VC \ TimePilot84 \ TimePilot84 \ main.obj 1
我不明白如果它的构造函数是私有的,如果访问公共构造函数是公共的,那么如何实例化这个类会产生错误
我意识到在调用Get函数中的构造函数之前我没有测试该类是否存在,并且我还没有析构函数。
我只在main中对这个函数进行一次调用,它不会编译。谢谢你的帮助。
答案 0 :(得分:1)
您必须定义static
成员。这应该在.cpp文件中而不是在标题中完成:
Singleton *Singleton::instance = nullptr;
另请注意,实例应仅创建一次,因此Get()
应如下所示:
Singleton *Singleton::Get()
{
if (!instance)
{
instance = new Singleton;
}
return instance;
}
或者,您可以抛弃static
成员变量并实现Get()
,如下所示:
Singleton *Singleton::Get()
{
static Singleton instance;
return &instance;
}
后者具有在程序退出时调用Singleton :: ~Singleton()的额外效果。
答案 1 :(得分:0)
您需要定义静态变量实例。在声明课程后添加以下内容:
Singleton* Singleton::instance = nullptr;