在实现单例模式时避免未解析的外部问题 [duplicate]

Avoid unresolved externals when implementing singleton pattern [duplicate]

提问人:sanitizedUser 提问时间:1/1/2021 最后编辑:user4581301sanitizedUser 更新时间:1/1/2021 访问量:124

问:

考虑以下 MRE

class Segment
{
public:
    void update();
};

class Singleton
{
    Singleton();
public:
    static Singleton& get_instance();
    void complete();
};

void Segment::update()
{
    Singleton::get_instance().complete();
}

Singleton& Singleton::get_instance()
{
    static Singleton instance;
    return instance;
}
void Singleton::complete()
{}

int main()
{
    return 0;
}

当我在 VS2019 中的标准调试配置下编译代码时,我收到一个关于函数未解析的外部的链接器错误。get_instance()

完整的错误描述

LNK1120 1 unresolved externals
LNK2019 unresolved external symbol
"private: __cdecl Singleton::Singleton(void)"
(??0Singleton@@AEAA@XZ) referenced in function
"public: static class Singleton & __cdecl Singleton::get_instance(void)"
(?get_instance@Singleton@@SAAEAV1@XZ)

我首先声明了类,然后实现了所有方法,所以有什么问题?

C++ 单例 未解析外部

评论

1赞 user4581301 1/1/2021
'Singleton::Singleton()' 的定义在哪里?看起来你把它遗漏了。
2赞 Algirdas Preidžius 1/1/2021
"我收到一个关于函数 get_instance()“ 的未解析外部的链接器错误 不,您收到有关 中引用的错误。"private: __cdecl Singleton::Singleton(void)"get_instance()

答:

1赞 Filip Roséen - refp 1/1/2021 #1

您缺少静态成员函数 () 中使用的构造函数的定义;它不是在抱怨静态成员函数本身(它被正确定义)。Singleton::Singleton()

删除声明,因为在您的示例中不需要上述构造函数,将其声明为 (c++11),或者编写适当的代码来实际定义它。Singleton() = default;

这一切都在诊断中说明,您只需要更仔细地阅读即可。