C++ Singleton LNK2019 - “函数(私有静态)中引用的未解析的外部符号(私有静态)”[重复]

问题描述 投票:0回答:1

在实现单例类时遇到困难(使用来自 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)

抱歉,如果这个问题在其他地方得到了回答,我已经看过了,但真诚地找不到它。

c++ singleton lnk2019
1个回答
0
投票

除了缺少构造函数之外,您也可以将其声明为

=default
;我通常建议以不同的方式进行单例:

ActionLogger& ActionLogger::getInstance()
{
   static ActionLogger instance;
   return instance;
}

这迫使每个人都经历

getInstance
,而且它也是线程安全的,以防你遇到这种事情。

此外,正如您所看到的,我已将返回值从指针更改为引用。我更喜欢这样做来表明你总是得到对象——如果某个东西返回一个指针,它(几乎)总是因为它可以是一个

nullptr
来指示某些类型的问题。

如果你在程序退出时遇到清理问题,因为 C++ 不关心是否有人仍在使用你的

instance
,你也可以像这样阻止清理:

ActionLogger& ActionLogger::getInstance()
{
   static ActionLogger& instance=*new ActionLogger();
   return instance;
}
© www.soinside.com 2019 - 2024. All rights reserved.