我正在为我的游戏实现一个单例类,但每次我尝试编译它时,都会产生编译错误。代码如下:
//Singleton.h
#pragma once
class Singleton{
public:
static Singleton* Instance();
private:
Singleton(){};
static Singleton* m_instance;
};
Singleton* SingletonInstance = Singleton::Instance();
Singleton.cpp
//Singleton.cpp
#include "Untitled1.h"
Singleton* m_instance = nullptr;
Singleton* Singleton::Instance(){
if(m_instance == nullptr){
m_instance = new Singleton;
}
return m_instance;
}
我收到以下错误:
||=== Build: Debug in df (compiler: GNU GCC Compiler) ===| obj\Debug\Untitled1.o||In function `ZN9Singleton8InstanceEv':| C:\Users\Samsung R519\Desktop\Untitled1.cpp|7|multiple definition of `SingletonInstance'| obj\Debug\main.o:C:\Users\Samsung R519\Desktop\main.cpp|4|first defined here| obj\Debug\Untitled1.o:Untitled1.cpp|| undefined reference to `Singleton::m_instance'| obj\Debug\Untitled1.o:Untitled1.cpp|| undefined reference to `Singleton::m_instance'| ||=== Build failed: 4 error(s), 0 warning(s) (0 minute(s), 10 second(s)) ===|
我做错了什么?
答案 0 :(得分:3)
在.cpp文件中,您定义的是不属于成员的新m_instance
。
请尝试
Singleton* Singleton::m_instance = nullptr;
答案 1 :(得分:3)
您的代码存在两个问题。
Singleton* SingletonInstance = Singleton::Instance();
您不应将该定义放在头文件中。相反,您应该在标头中声明SingletonInstance
并在.cpp文件中定义它。事实上,没有必要拥有这个全局变量。您随时可以致电Singleton::Instance()
获取单身人士。
m_instance
是Singleton
的成员,因此您应该使用类名定义它:Singleton::m_instance
解决方案:
// xxx.h
// other code...
extern Singleton* SingletonInstance; // declaration
// xxx.cpp
// other code...
Singleton* Singleton::m_instance = nullptr; // specify the class name
Singleton* SingletonInstance = Singleton::Instance(); // definition
答案 2 :(得分:1)
class Singleton{
....
static Singleton* m_instance;
}
和
Singleton* m_instance = nullptr;
即使具有相同的名称,它们也是不同的指针,因为它们具有不同的范围:第一个是类成员的声明,第二个是全局命名空间中指针的声明和定义。 / p>
所以,你要找的是类成员指针的定义,它是:
Singleton* Singleton::m_instance = nullptr;
答案 3 :(得分:1)
我建议你使用Scott Meyers单身人士。我将避免任何与初始化顺序相关的错误以及与单例相关的任何内存管理错误。
以下是您实施方式:
struct Singleton {
static Singleton& instance() {
static Singleton myInstance;
return myInstance;
}
};
如果你想返回一个指针而不是一个引用,这同样没问题。