我遵循这种单例模式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/