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文件中定义所有内容.
你能简化吗?
class State
{
public:
static State& GetInstance()
{
static State _instance;
return _instance;
}
};
Run Code Online (Sandbox Code Playgroud)
看,它是隐藏的,它是按需的,它是线程安全的,它没有跳跃的工作.
静态初始化确保相当于instance == NULL
没有任何额外的努力.它还确保在(关闭)过程关闭之前进行适当的破坏(假设正常终止).
这样做的唯一假设是你不希望能够"强行"重置单例实例.