突发奇想,想搞个用来创建单例对象的对象创建类,但是写出来是错的,找不到函数,麻烦大佬瞧瞧该怎么写。
#ifndef __LAZY__SINGLETON__OBJECT__CREATER__
#define __LAZY__SINGLETON__OBJECT__CREATER__
#include <mutex>
// 懒汉单例创建对象
template <typename T>
class LazySingletonObjectCreater {
private:
// 构造函数私有
LazySingletonObjectCreater();
// 锁
static std::mutex mutex;
// 该对象创建器的实例化对象
static LazySingletonObjectCreater<T>* objectCreaterPoint;
// 创建的对象指针
static T* objectPointer;
class DeleteObject {
public:
~DeleteObject() {
if (objectCreaterPoint != nullptr) {
delete objectCreaterPoint;
objectCreaterPoint = nullptr;
}
if (objectPointer != nullptr) {
delete objectPointer;
objectPointer = nullptr;
}
}
};
//静态变量会在程序结束时调用它的析构函数
static DeleteObject del;
public:
// 该对象创建器的实例化方法
static LazySingletonObjectCreater<T>* instance() {
if (objectCreaterPoint == nullptr) {
mutex.lock();
if (objectCreaterPoint == nullptr) objectCreaterPoint = new LazySingletonObjectCreater();
mutex.unlock();
}
return objectCreaterPoint;
}
// 获取创建的对象
static T* getObject() {
if (objectPointer == nullptr) {
mutex.lock();
if (objectPointer == nullptr) objectPointer = new T();
mutex.unlock();
}
return objectPointer;
}
};
#endif
报错信息:(编译器是MinGW8.1.0)
在c++17之前, 类里面的 static 成员变量需要在 .cpp 文件里做一下定义.
不然就会出现你图中的 "未定义的引用" 类型的错误.
如果使用c++17标准进行编译, 可以使用 inline 关键字来简化代码, 例如
// c++17 代码
#include <mutex>
class Object {
// ...
private:
inline static std::mutex mutex{};
};