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

C++单例的一些缺点:

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

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

template <class T>
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 <typename T>
T *base_manager<T>::m_instance_ptr = new T;

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

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


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

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

例子2:

class tts_manager : public base_manager<tts_manager> {
 public:

  void run_demo(UdpMessagePtr &buf);

 private:

  std::vector<std::string> get_demo_text();

  friend base_manager<tts_manager>;

  tts_manager() = default;

};

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

  • 注意要在派生类中申明 friend base_manager<xxx_manager>; 因为实例是基类的,基类需要访问派生类的构造函数
  • 这样做,有点像自己继承了自己,有些奇怪
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值