【问题标题】:How to get ref from GetInstance from main app?如何从主应用程序的 GetInstance 获取 ref?
【发布时间】:2013-09-12 22:30:06
【问题描述】:

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

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

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

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: virtual void __thiscall MesherApp::setup( void)" (?setup@MesherApp@@UAEXXZ)

还尝试了以下方法,因为有人说“在课堂外定义”——这甚至意味着什么?

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

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

【问题讨论】:

    标签: c++ static compilation singleton


    【解决方案1】:

    你能简化吗?

    class State
    {
       public:
    
          static State& GetInstance() 
          {
              static State _instance; 
              return _instance;
          }
    };
    

    你看,它是隐藏的,它是按需的,它是线程安全的,而且它可以在没有跳跃的情况下工作。

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

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

    【讨论】:

    • 没有线程问题。当然,我说的是单例的初始化,这是这里的职责。 State 本身是否是线程安全的,这取决于您。 (IOW我的解决方案比你展示的代码更线程安全)
    • 顺便说一下,在这里查看关于函数局部静态的线程安全初始化的 c++11 标准引用:stackoverflow.com/a/7923623/85371stackoverflow.com/questions/1270927/…
    • 啊,我刚从同事那里得知静态(在方法 GetInstance 中)是静态的原始 C 版本(在静态的所有其他用途被发明之前)。
    • 我想说他/她可能混淆了静态的许多含义。可能他/她只是年纪大了:/我会说阅读here about the static keywordhere about your linker error
    【解决方案2】:

    我认为这个答案是合适的,如果我发现自己使用单例,我会扎根。

    另一方面,您的代码存在问题:

    State* instance = NULL;
    

    应该是

    State* State::instance = NULL;
    

    我还刚刚注意到另一个错误是:

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

    应该是:

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

    【讨论】:

    • 感谢您添加该位。它在其他答案中(以及在“相关”侧边栏中:)
    • 赞成正确性。 Sehe 在几秒钟内得到了更好的解决方案 =)
    • 哈哈,呵呵。只是为了确定,我回过头来并排制作了 State::unstance 和 State::GetUnstance() 并且确定了,编译得很好。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2021-10-31
    • 2014-11-29
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    相关资源
    最近更新 更多