栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

比较实用的,C++单例模式实现方式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

比较实用的,C++单例模式实现方式

C++单例的一些缺点:

没有自带关键字来实现单例模式,老是需要自己写,但是又有很多类需要使用单例模式。
造成了一种问题:ConfigManager中有单例相关的代码,MySqlManager中有单例相关的代码。
很多类中,有单例相关的代码。自己写了一个实现单例的,比较好的模板:
也就是可以继承的单例模式:

抽象的基类,实现单例逻辑:

template 
class base_manager {
 public:
  static T *get_instance();

  //入口 运行demo示例
  virtual void run_demo(UdpMessagePtr &buf) = 0;  改成自己的

 protected:
  base_manager() = default;
  virtual ~base_manager() = default;

 private:
  static T *m_instance_ptr;

  base_manager(base_manager &) = delete;

  base_manager &operator=(const base_manager &) = delete;
};

template 
T *base_manager::m_instance_ptr = new T;

template 
T *base_manager::get_instance() {
  return m_instance_ptr;
}

派生的子类,实现干活的业务逻辑:
例子1:

class asr_manager : public base_manager {
 public:
  void run_demo(UdpMessagePtr &buf);

 private:
  asr_manager() = default;
  friend base_manager;
};

例子2:

class tts_manager : public base_manager {
 public:

  void run_demo(UdpMessagePtr &buf);

 private:

  std::vector get_demo_text();

  friend base_manager;

  tts_manager() = default;

};

这样,无论代码中有多少单例的类,只需要public继承 base_manager 就行了。

  • 注意要在派生类中申明 friend base_manager; 因为实例是基类的,基类需要访问派生类的构造函数
  • 这样做,有点像自己继承了自己,有些奇怪
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/444058.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号