【问题标题】:Trouble accessing a Singleton Class C++无法访问单例类 C++
【发布时间】:2018-05-31 03:42:00
【问题描述】:

我正在尝试为来自各种类的游戏数据的集中访问点编写一个单例类。这就是我所拥有的......现在只是通用的。

--> 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 中对这个函数进行了一次调用,它不会编译。感谢您的帮助。

【问题讨论】:

标签: c++ singleton


【解决方案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() 的额外效果。

【讨论】:

  • 完美...谢谢。它不会让我在标题中定义静态成员。正如你所写的,我尝试了这两种方法,它们都有效。我最终使用了后者,更干净。
【解决方案2】:

您需要定义静态变量实例。在类声明后添加以下内容:

Singleton* Singleton::instance = nullptr;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-12
    • 2013-09-25
    • 2018-10-17
    相关资源
    最近更新 更多