C++ LNK Error 2001: 类中声明的静态属性未定义错误
程序员文章站
2024-02-22 21:56:42
...
项目场景:
使用C++实现单例模式时遇到的link error 2001。
问题描述:
今天在编译C++代码时,出现如下错误:
代码如下:
#include <iostream>
#include <memory>
#include <mutex>
//****************Singleton Pattern****************
class Singleton
{
private:
static Singleton* ptrInstance;
static std::mutex m_mutex;
Singleton() {}
public:
static Singleton* GetInstance()
{
if (ptrInstance == NULL)
{
std::lock_guard<std::mutex> lock(m_mutex);
if (ptrInstance == NULL)
{
ptrInstance = new Singleton();
}
}
return ptrInstance;
}
~Singleton()
{
if (ptrInstance != NULL)
{
std::lock_guard<std::mutex> lock(m_mutex);
if (ptrInstance != NULL)
{
delete ptrInstance;
}
}
}
};
//*********************Test***********************
int main()
{
Singleton* obj1 = Singleton::GetInstance();
Singleton* obj2 = Singleton::GetInstance();
if (obj1 == NULL)
{
std::cout << "obj1 is null" << std::endl;
}
if (obj2 == NULL)
{
std::cout << "obj1 is null" << std::endl;
}
if (obj1 == obj2)
{
std::cout << "Single obj1 = obj2" << std::endl;
}
else
{
std::cout << "Single obj1 != obj2" << std::endl;
}
system("pause");
return 0;
}
原因分析:
从错误信息看,是说定义的类Singleton中静态属性没有找到,这很奇怪,明明已经定义了,这个错误经常遇到是一个dll调用另外dll的函数时,如果被调用的函数不存在,或者调用传参不一致,或者定义函数的dll中声明与定义的函数接口参数类型不同,都有可能发生这种link错误,但是很明显,这里不是。
遇到不会就google, 果然有解释[外部链接],这里的问题是由于只在类中声明了静态属性,没有定义,需要在外面对类的静态属性进行定义,C++基础不牢靠,竟然忘记了这点。
解决方案:
在Singleton类的外面对静态属性进行定义,如下:
std::mutex Singleton::m_mutex;
Singleton* Singleton::ptrInstance = NULL;
编译通过, 运行OK, 完美!
上一篇: Java简易抽奖系统小项目