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

How to get ref from GetInstance from main app?

本文关键字:获取 引用 GetInstance 应用程序      更新时间:2023-10-16

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

我的错误似乎不同,或者以前的答案不足。我已经尝试了"你需要在课堂外定义s_instance"的建议,这对我这个 cpp 菜鸟来说没有意义。我在标头中声明静态,并在 cpp 中定义它们的实现。

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

状态.h

class State
{   
public: 
    State(void);
    ~State(void);
    static State* instance; 
    static State* GetInstance(); 
... 
};

状态.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: Virtual void __thiscall MesherApp::setup(void)"中引用(?setup@MesherApp@@UAEXXZ)

还尝试了以下内容,因为有人说"在类外定义"——这甚至是什么意思?

class State
{
   public:
   ...
}
static State* instance; 
static State* GetInstance(); 

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

你能简化一下吗?

class State
{
   public:
      static State& GetInstance() 
      {
          static State _instance; 
          return _instance;
      }
};
看,它是隐藏的,它是按需的,

它是线程安全的,它无需跳箍即可工作。

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

唯一的假设是,您不希望能够"强制"重置单一实例。

我认为 sehe 答案是合适的,如果我能找到我自己使用单例,我会扎根。

另一方面,您的代码问题就在这里:

State* instance = NULL;

它应该是

State* State::instance = NULL;

我也刚刚注意到另一个错误,即:

State* GetInstance()
{
    //...
}

应该是:

State* State::GetInstance()
{
    //...
}