# cppMisc **Repository Path**: galaxy_0/cpp-misc ## Basic Information - **Project Name**: cppMisc - **Description**: 工程级的设计模式模板库(design pattern),算法(algorithm),数据结构(data structure)以及一些通讯等常用库的实现和封装。主要包含了一般通讯,LOG,设计模式,数据容器等内容。设计模式模板类是其中的重点实现模块 - **Primary Language**: C++ - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 51 - **Forks**: 12 - **Created**: 2023-04-17 - **Last Updated**: 2025-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: Cpp, 设计模式 ## README #### 与本资源中设计模式实现部分的designM目录下配套的树已经出版。而且已经被中科院文献情报中心收录。有兴趣的同学可以在京东,当当等平台购买 ![输入图片说明](doc/bb5da93a56ee03d4.jpg) https://www.las.ac.cn/front/book/detail?id=f76459d8276839586319b1443649d568 ![输入图片说明](doc/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20250611161729.png) # cppMisc #### changelog - 2025-04-30 修改了状态模式模块的类型定义部分,增强了类型检查能力 - 2025-04-30 验证完成了sharedMem模块 - 2025-04-21 新增了linux共享内存封装sharedMem,暂时没有经过验证,小心使用 - 2024-12-13 单例模式(designM/singleton.hpp)增加了多线程支持, 提高了在多线程情况下的安全性 - 2024-07-04 线程池增加排队队列长度限制,超出则会抛出std::runtime_error. 默认队列长度为10000,可以用包含队列长度的构造函数指定最大长度 - 2024-05-07 新增debug模块,输出调用栈信息,目前仅仅调试了在linux下的模块。使用非常简单,比如 ``` #include "debug.hpp" void func() { wheels::debug::printCallstack(); } ``` - 2024-04-02 在计时器模块中新增一个orderedTimer类,提供了排序的软计时器功能,程序中可以仅仅一个系统计时器,通过软计时器完成多计时器的功能。 - 2024-03-28 解释器模式,增加执行函数接口 - 2023-11-23 新增ssl服务器 - 2023-11-20 新增了访问者模式 - 2023-11-6 新增状态模式 - 2023-11-3 新增了中介者模式 - 2023-11-2 新增了备忘录模式,组合模式和代理模式 - 2023-7-15 新增了INI文𢓐处理模块 - 2023-7-14 新增了适配器模式 include/designM/adaptor.hpp - 2023-7-7 新增了外观模式,include/designM/facade.hpp"分别以接口和继承的两种方式实现 , 示例在example目录下 - 2023-7-4 新增了建造者模式,include/designM/build.hpp , 示例在example目录下 - 2023-6-30 新增了抽象工厂模式 include/designM/absFactory.hpp,示例在example目录下 - 2023-6-26 新增了线程池 include/threadPool.hpp - 2023-5-28 新增红黑树 - 2023-5-7 新增variant,任意数据类型, 文件路径container/variant.hpp。这个模块是一个纯头文件的模板类,支持在其他的stl容器中使用这个模块 - 2023-5-9 新增variant简单介绍文档 #### 介绍 我自己常用的基础算法,接口的封装。主要包含了常用的设计模式,容器和一些常用的功能性接口。 - 设计模式目前已经实现里单例模式,装饰模式,工厂模式和桥接模式,位于include/designM目录。设计模式实现都是采用纯头文件的方式可以直接引用 - 容器目前实现了AVL, variant , 红黑树rbTree。这部分代码位于include/container目录中 - cefQT是一个可以在QT程序中嵌入浏览器的模块,这个模块依赖于libcef,使用的时候需要先安装libcef #### 安装教程 - 单例模式使用说明: 业务实现类应该继承于singleton,并在实现文件中使用宏 IMP_SINGLETON 在头文件中: ``` #include "designM/singleton.hpp" class newSingleClass : public wheels::dm::singleton< newSingleClass > { // 您自己的实现代码 }; ``` 在实现文件中: ``` IMP_SINGLETON(newSingleClass); // 您自己的实现代码 ``` 应用时: 创建对象,create支持可变参数方式,因此可以应用于有不同参数的构造函数 ``` newSingleClass * p = newSingleClass::create(); newSingleClass * p = newSingleClass::create( 12 , "abc" ); ``` 获取对象: ```auto * p = newSingleClass::get();``` - 工厂模式:工厂模式采用两种方式实现,一种是采用类继承的方式;一种是采用模板函数的方式 1. 采用模板函数的方式适用于公有的构造函数的类,例如: ``` class a{ public: a(); a( int c ); }; a * pa = factory< a >( 23 ); a * pa2 = Factory< a >( []( Factory::emErrCode err){ // 错误处理 } , 23 ); ``` 这里注意,工厂函数考虑了创建没有考虑销毁,在使用完成对象后要自己调用delete完成对象的销毁 2. 采用类继承的方式适用于采用私有构造函数的方式,例如 ``` class a : public Factory< a >{ public: a(); a( int c ); }; a * pa = a::factory( 23 ); ``` - 责任链模式 使用示例: ``` class myItfc{ virtual int do_something( int ) = 0; 定义接口 }; class myItfc1 : public myItfc{ 接口实现1 }; class myItfc1 : public myItfc{ 接口实现2 }; class myRsps : public rspsLink< myItfc >{ 自己的定义和方法 } myRsps rsps; rsps.push_back( new myItfc1 ); rsps.push_back( new myItfc2 ); rsps.push_back( ... ); /// 按照责任链传递操作 int a = 1; rsps.forward([&]( myRsps::stLinkItem& item ){ a = item->do_something( a ); }); ```