单例的例子

这篇具有很好参考价值的文章主要介绍了单例的例子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <boost/noncopyable.hpp>
#include <boost/serialization/singleton.hpp>
#include <iostream>
 
// 使用方式1:模板参数方式
class CTest:public boost::noncopyable // 不能复制、赋值
{
public:
    void Set(int i){ m_val = i; }
    void Print() const{ std::cout<<m_val<<std::endl;}
private:
    int m_val;
};
// 使用typedef以及宏来简化使用
typedef boost::serialization::singleton<CTest> singleton_ctest; // 使用模板的方式只允许单个实例
#define sCTest singleton_ctest::get_mutable_instance() // 非const实例
#define sCTest_const singleton_ctest::get_const_instance() // const实例
 
 
// 使用方式2:继承方式
class CDerived:public boost::serialization::singleton<CDerived> // 只允许单个实例,不能复制、赋值(基类派生自boost::noncopyable)
{
public:
    void Set(int i){ m_val = i; }
    void Print() const{ std::cout<<m_val<<std::endl;}
 
private:
    int m_val;
};
#define sCDerived CDerived::get_mutable_instance() // 非const实例
#define sCDerived_const CDerived::get_const_instance() // const实例
 
int main()
{
//     singleton_ctest obj1;
//     singleton_ctest obj2;
    sCTest.Set(10);
    sCTest_const.Print(); // 10
 
    // 操作类的非static成员
    CDerived cobj;
    CDerived cobj2;
    cobj2.Set(89);
    cobj.Set(10);
    
    // 单例的概念:并非是不能定义两个类对象本身
    // 而是当有多个对象时,通过boost提供的静态成员函数get_mutable_instance()返回实例再调用普通成员函数之后,
    // 类对象的结果保持一致,就好像类中的所有数据成员都是static一样
 
    // 这时的类好像定义了两种同名的数据成员以及成员函数:static与非static
    // 非static由普通方式调用:即先定义类对象,再调用成员函数
    // static先调用由boost提供的get_mutable_instance()(或get_const_instance())再调用成员函数的方式
    // 从而保证单例(因为类的所有成员共享static)
    // 两种调用互不影响(各自数据成员是分离的),唯一的影响是类现在派生自boost::noncopyable
 
    //操作类的“static成员”
    CDerived::get_mutable_instance().Set(20);
    CDerived::get_mutable_instance().Print(); // 20
    // same way:
    sCDerived.Set(20); 
    sCDerived.Print();  // 20
    /*sCDerived_const.Set(89); // error*/
    sCDerived_const.Print(); // 20
    cobj2.get_mutable_instance().Print(); // 20
    cobj.get_mutable_instance().Print(); // 20
 
    // 操作类的非static成员
    cobj2.Print(); // 89
    cobj.Print(); // 10
 
    // 实际使用中,我们没有必要也不应该直接定义类对象,而是应该总是通过使用类的static成员函数:
    // classname::get_mutable_instance().memberFunction(para);(或get_const_instance())来确保“单个实例”
    // 本例中定义的宏的使用方式与类对象的使用方式相同:name.member_function(para);
    // 可以将宏当做“对象”
    
    return 0;
}

文章来源地址https://www.toymoban.com/news/detail-731155.html

到了这里,关于单例的例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【设计模式】单例模式、“多例模式”的实现以及对单例的一些思考

    单例模式是设计模式中最简单的一种,对于很多人来说,单例模式也是其接触的第一种设计模式,当然,我也不例外。这种设计模式在学习、面试、工作的过程中广泛传播,相信不少人在面试时遇到过这样的问题:“说说你最熟悉的集中设计模式”,第一个脱口而出的就是单

    2024年02月07日
    浏览(48)
  • 设计模式——C++11实现单例模式(饿汉模式、懒汉模式),与单例的进程

    本文将介绍单例模式,使用C++11实现多个版本的单例模式,分析各自的优缺点。最后提及如何实现一个单例的进程。 单例模式属于创建型模式,提供了一种创建对象的方式。 单例模式确保一个类只有一个实例。通过一个类统一地访问这个实例。 思想:将构造函数设置为私有

    2024年02月09日
    浏览(48)
  • 源自Boost最优雅的C++单例模式

    Boost功能非常强大,在此借鉴一下其线程库中的单例源码,线程安全且优雅。 include/boost/thread/detail/singleton.hpp

    2024年02月17日
    浏览(31)
  • 【单例模式】饿汉式、懒汉式、静态内部类--简单例子

    单例模式是⼀个单例类在任何情况下都只存在⼀个实例,构造⽅法必须是私有的、由⾃⼰创建⼀个静态变量存储实例,对外提供⼀个静态公有⽅法获取实例。 目录 一、单例模式 饿汉式  静态内部类 懒汉式 反射可以破坏单例 道高一尺魔高一丈 枚举 类⼀加载就创建对象,这

    2024年04月23日
    浏览(59)
  • 【设计模式】六、【创建性模式】揭秘单例模式:从生活例子到Java代码

    转自:提升工作效率-单例模式详解 1、介绍 单例模式的产生,它主要是为了解决在软件系统中,对于一些类,我们只需要创建一个全局唯一的实例。例如,系统的配置信息、数据库连接池等。如果有多个实例可能会导致状态不一致,或者额外的资源消耗。这个需求在很多软件

    2024年02月06日
    浏览(43)
  • [C++项目] Boost文档 站内搜索引擎(4): 搜索的相关接口的实现、线程安全的单例index接口、cppjieba分词库的使用、综合调试...

    有关 Boost 文档搜索引擎的项目的前三篇文章, 已经分别介绍分析了: 项目背景: 🫦[C++项目] Boost文档 站内搜索引擎(1): 项目背景介绍、相关技术栈、相关概念介绍… 文档解析、处理模块 parser 的实现: 🫦[C++项目] Boost文档 站内搜索引擎(2): 文档文本解析模块parser的实现、如何对

    2024年02月14日
    浏览(49)
  • 测试用例的设计思考

    毕业后的第一家公司个人认为除了加班巨多还是很不错的,我认为前司对于测试的流程和规范是非常棒的,对于测试用例的设计和评审都会有较高的要求。在前司的一年确实学到很多和测试流程和测试设计相关的知识。以下为自己的经验之谈,就是在一个模块到我手里的时候

    2024年02月10日
    浏览(40)
  • 如何评估测试用例的质量

    评估测试用例的质量是确保测试有效性和准确性的关键步骤。以下是一些评估测试用例质量的方法: 1.完整性 评估测试用例是否涵盖了需求和功能的所有方面。检查用例是否覆盖了各种场景、边界值和异常情况,以确保测试的全面性和完整性。 2.可读性 评估测试用例的可读

    2024年02月12日
    浏览(42)
  • 以SQLserver为例的Dapper详细讲解

    Dapper是一种轻量级的ORM(对象关系映射)工具,它提供了高效且易于使用的方式来执行数据库操作。 Dapper是由Stack Overflow团队开发并维护的,它的主要目标是提供比EF更快、更直接的方式访问数据库。 Dapper的主要特点包括: 基于纯ADO.NET而不是EF,因此性能更高 支持多种数据

    2023年04月24日
    浏览(44)
  • 【测试开发】测试用例的设计方法

    目录 一. 测试用例的基本要素   二. 测试用例的设计方法 1. 测试用例设计的万能公式 水杯测试用例  2. 基于需求的设计方法 邮箱注册测试用例   3. 等价类方法 有效等价类和无效等价类  等价类思想设计测试用例步骤  4. 边界值方法 边界值思想设计测试用例步骤  5. 判定

    2024年02月16日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包