目录ISingleton.hpp使用方式Aclass.hAclass.cppmain.c在我们日常开发中,无可避免需要使用单例模式进行设计类对象,那么实际上我们写单例格式基本都是一样
在我们日常开发中,无可避免需要使用单例模式进行设计类对象,那么实际上我们写单例格式基本都是一样的,那么每次都要写几乎一模一样的代码来实现我们需要的单例对象是不是会觉得很累?下面博主提供一种单例模板来完成我们日常设计单例类,提高工作效率。既然封装了,那么当然是封装一个线程安全的单例模板,如下:
#pragma once
#include <stdlib.h>
#include <assert.h>
#include <thread>
#include <mutex>
#define SINGLETON_CLASS_DEFAULT(Class) \
private: \
Class() {} \
~Class() {} \
Class(Class &other) {} \
Class(const Class &other) {} \
Class& operator=(Class &other) {} \
Class& operator=(const Class &other) {} \
#define SINGLETON_CLASS_FUNC_DECL(Class) \
public: \
static Class& Ins(); \
private: \
static void InitSingleton(); \
\
static void Release(); \
\
SINGLETON_CLASS_DEFAULT(Class) \
private: \
static std::once_flag m_singletonFlag; \
static Class* m_ins;
#define SINGLETON_CLASS_FUNC_IMPL(Class) \
Class& Class::Ins() { \
\
\
\
\
\
\
\
std::call_once(m_singletonFlag, &Class::InitSingleton); \
assert(m_ins != NULL); \
return *m_ins; \
} \
\
void Class::InitSingleton() { \
m_ins = new Class; \
if (m_ins) { \
\
\
\
::atexit(Release); \
} \
} \
\
void Class::Release() { \
if (m_ins) { \
delete m_ins; \
m_ins = NULL; \
} \
}
#define SINGLETON_CLASS_VARIABLE_IMPL(Class) \
std::once_flag Class::m_singletonFlag; \
Class* Class::m_ins = NULL;
#define SINGLETON_CLASS_IMPL(Class) \
SINGLETON_CLASS_VARIABLE_IMPL(Class) \
SINGLETON_CLASS_FUNC_IMPL(Class)
注意,如果我们的单例类对象在.hpp文件中那么可能出现重定义的问题,博主设计的单例模板,只适用于.h和.cpp,即声明和定义分开单例类对象。
#include "ISingleton.hpp"
class Aclass {
//声明
SINGLETON_CLASS_FUNC_DECL(Aclass)
public:
int a;
};
#include "Aclass.h"
//定义
SINGLETON_CLASS_IMPL(Aclass);
#include "Aclass.h"
int main() {
//Aclass a; err
Aclass::Ins().a = 5;
std::cout << Aclass::Ins().a << std::endl;
return 0;
}
运行结果:
到此这篇关于c++使用宏函数实现单例模板详解的文章就介绍到这了,更多相关C++宏函数实现单例模板内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: C++使用宏函数实现单例模板详解
本文链接: https://www.lsjlt.com/news/195565.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0