单例错误

Error in Singleton

我正在为我的游戏实现单例 class,但每次我尝试编译它时,它都会出现编译错误。代码如下:

    //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)) ===|

我做错了什么?

在 .cpp 文件中,您正在定义一个新的 m_instance,它不是成员。

请尝试

Singleton* Singleton::m_instance = nullptr;
 class Singleton{
           ....
           static Singleton* m_instance;
  }

Singleton* m_instance = nullptr;

尽管名称相同,但它们是不同的指针,因为它们具有不同的作用域:第一个是 class 成员的声明,第二个是指针的声明和定义在全局命名空间中。

所以,你要找的是class成员指针的定义,也就是:

Singleton* Singleton::m_instance = nullptr;

您的代码有两个问题。

  1. Singleton* SingletonInstance = Singleton::Instance(); 你不应该把定义放在 header 文件中。相反,您应该在 header 中声明 SingletonInstance 并在 .cpp 文件中定义它。事实上,没有必要有这个全局变量。您可以随时调用 Singleton::Instance() 来获取单例。

  2. m_instanceSingleton 的成员,因此您应该使用 class 名称定义它: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

我建议您使用 Scott Meyers 单例。我将避免任何与初始化顺序相关的错误以及与单例相关的任何内存管理错误。

以下是您的实现方式:

struct Singleton {
    static Singleton& instance() {
        static Singleton myInstance;

        return myInstance;
    }
};

如果你想return一个指针而不是一个引用,这同样没问题。