我遵循这种单例模式why error LNK2001: unresolved external symbol in this case?,我的问题看起来也很相似,但是我的问题不在于静态实例的定义。我的问题是从另一个类解析静态GetInstance()定义。

我的错误似乎有所不同,或者先前的答案不充分。我尝试了建议,“您需要在类外定义s_instance”,对于cpp菜鸟来说这对我来说没有任何意义。我在头文件中声明了静态变量,并在cpp中也定义了它们的实现。

我也不需要关于单例线程安全的讲座,处理程序绑定(bind)使用signal2 ...

State.h

class State
{
public:
    State(void);
    ~State(void);

    static State* instance;
    static State* GetInstance();
...

};

State.cpp
State::AppState mCurrentState;
boost::signals2::signal<void ()> mSignal;


State* instance = NULL;
State* GetInstance()
{
    if( instance == NULL)
    {
        instance = new State();
        return instance;
    }
    else
    {
        return instance;
    }
}

所有这些都可以编译。然后当我尝试像这样访问单例时State *state = State::GetInstance();,出现“无法解析的外部符号”错误。

错误LNK2019:未解决的外部符号“公共(public):静态类状态* __cdecl状态:: GetInstance(void)”(?GetInstance @ State @@ SAPAV1 @ XZ)在函数“公共(public):虚拟void __thiscall MesherApp::setup(void)”中引用(?setup @ MesherApp @@ UAEXXZ)

还尝试了以下方法,因为有人说“课外定义”-这甚至意味着什么?
class State
{
   public:
   ...
}
static State* instance;
static State* GetInstance();

看着这个问题,Static method with a field我不明白这是如何应用的。我在.h中声明并在cpp文件中定义了所有内容。

最佳答案

你可以简化吗?

class State
{
   public:

      static State& GetInstance()
      {
          static State _instance;
          return _instance;
      }
};

瞧,它是隐藏的,它是按需提供的,它是线程安全的,并且可以正常运行。

静态初始化确保在那里的instance == NULL等效,而无需任何额外的努力。它还确保在过程关闭之前(假定正常终止)正确销毁。

这样做的唯一假设是,您不希望“强制”重置单例实例。

关于c++ - 如何从主应用程序获取GetInstance的引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18775333/

10-10 07:39