欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ LNK Error 2001: 类中声明的静态属性未定义错误

程序员文章站 2024-02-22 21:56:42
...

项目场景:

使用C++实现单例模式时遇到的link error 2001。


问题描述:

今天在编译C++代码时,出现如下错误:
C++ LNK Error 2001: 类中声明的静态属性未定义错误
代码如下:

#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, 完美!

相关标签: C++ bug c++