【问题标题】:Avoid unresolved externals when implementing singleton pattern [duplicate]实现单例模式时避免未解决的外部问题[重复]
【发布时间】:2024-01-05 04:00:01
【问题描述】:

考虑关注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 中的标准 Debug 配置下编译代码时,我收到一个关于 unresolved external for function 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)

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

【问题讨论】:

  • `Singleton::Singleton()` 的定义在哪里?看起来你漏掉了。
  • "我收到关于函数 get_instance() 的未解析外部的链接器错误" 不,您会收到有关 "private: __cdecl Singleton::Singleton(void)" 的错误 referenced in @987654327 @.

标签: c++ singleton unresolved-external


【解决方案1】:

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

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

诊断书中都有说明,您只需要仔细阅读即可。

【讨论】: