如何从主应用程序获取GetInstance的引用?

Fla*_*ape 1 c++ singleton static compilation

我正在遵循这个单例模式,为什么错误LNK2001:在这种情况下未解析的外部符号?我的问题看起来很相似,但我的问题不在于静态实例的定义.我的问题是从另一个类解析静态GetInstance()定义.

我的错误似乎不同,或以前的答案是不充分的.我已经尝试过这样的建议,"你需要在课堂外定义s_instance"这对我来说是没有意义的cpp noob.我在标题中声明静态,并在cpp中定义它们的实现.

我也不需要关于单例的线程安全的讲座,处理程序绑定使用信号2 ...

State.h

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

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

};
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所有这些都很好.然后当我尝试访问这样的单例时 State *state = State::GetInstance();,我得到"未解析的外部符号"错误.

错误LNK2019:未解析的外部符号"public:static class State*__cdecl State :: GetInstance(void)"(?GetInstance @State @@ SAPAV1 @ XZ)在函数"public:virtual void __thiscall MesherApp :: setup(void)"中引用(?设置@ MesherApp @@ UAEXXZ)

还试过以下,因为有人说"在课外定义" - 这甚至意味着什么?

class State
{
   public:
   ...
}
static State* instance; 
static State* GetInstance(); 
Run Code Online (Sandbox Code Playgroud)

看看这个问题,带有字段的静态方法我看不出这是如何适用的.我在.h中声明并在cpp文件中定义所有内容.

seh*_*ehe 5

你能简化吗?

class State
{
   public:

      static State& GetInstance() 
      {
          static State _instance; 
          return _instance;
      }
};
Run Code Online (Sandbox Code Playgroud)

看,它是隐藏的,它是按需的,它是线程安全的,它没有跳跃的工作.

静态初始化确保相当于instance == NULL没有任何额外的努力.它还确保在(关闭)过程关闭之前进行适当的破坏(假设正常终止).

这样做的唯一假设是你不希望能够"强行"重置单例实例.