在实现单例类时遇到困难(使用来自 GeeksForGeeks 的教程)。我有另一个实现相同的类,但是该类没有发生相同的问题。我看过很多类似的问题和教程,但没有提到这个特定问题,或者如果他们是,他们的解决方案已经在这里实施(据我所知)
头文件(简化)
class ActionLogger
{
public:
static ActionLogger* getInstance();
private:
ActionLogger();
ActionLogger(const ActionLogger& obj) = delete;
static ActionLogger* _instance;
}
.cpp 文件:
ActionLogger* ActionLogger::_instance = NULL;
ActionLogger* ActionLogger::getInstance()
{
if(_instance == NULL)
{
_instance = new ClassName();
}
return _instance;
}
错误信息:
错误 LNK2019:无法解析的外部符号“private:__cdecl ActionLogger::ActionLogger(void)" (??0ActionLogger@@AEAA@XZ) 在函数“public: static class ActionLogger * __cdecl”中引用 ActionLogger::getInstance(void)" (?getInstance@ActionLogger@@SAPEAV1@XZ)
抱歉,如果这个问题在其他地方得到了回答,我已经看过了,但真诚地找不到它。
除了缺少构造函数之外,您也可以将其声明为
=default
;我通常建议以不同的方式进行单例:
ActionLogger& ActionLogger::getInstance()
{
static ActionLogger instance;
return instance;
}
这迫使每个人都经历
getInstance
,而且它也是线程安全的,以防你遇到这种事情。
此外,正如您所看到的,我已将返回值从指针更改为引用。我更喜欢这样做来表明你总是得到对象——如果某个东西返回一个指针,它(几乎)总是因为它可以是一个
nullptr
来指示某些类型的问题。
如果你在程序退出时遇到清理问题,因为 C++ 不关心是否有人仍在使用你的
instance
,你也可以像这样阻止清理:
ActionLogger& ActionLogger::getInstance()
{
static ActionLogger& instance=*new ActionLogger();
return instance;
}