实现单例模式时避免未解决的外部问题
Avoid unresolved externals when implementing singleton pattern
考虑以下 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)
我先声明了 类,然后我实现了所有的方法,怎么了?
您缺少静态成员函数中使用的构造函数的定义 (Singleton::Singleton()
);它不是在抱怨静态成员函数本身(已正确定义)。
要么删除声明,因为在您的示例中不需要构造函数,将其声明为 Singleton() = default;
(c++11),或者编写适当的代码来实际定义它。
诊断上都写了,你再仔细看就好了。
考虑以下 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)
我先声明了 类,然后我实现了所有的方法,怎么了?
您缺少静态成员函数中使用的构造函数的定义 (Singleton::Singleton()
);它不是在抱怨静态成员函数本身(已正确定义)。
要么删除声明,因为在您的示例中不需要构造函数,将其声明为 Singleton() = default;
(c++11),或者编写适当的代码来实际定义它。
诊断上都写了,你再仔细看就好了。