C++实现单例模式

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

单例模式:

一种设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。它适用于需要全局唯一的对象或资源的情况。

23种设计模式种最简单最常见的一种(高频考点) 要求:通过一个类只能创建一个对象

1.构造函数私有化

2.定义静态的成员函数,其调用只能通过类名进行调用。

C++实现单例模式,C++学习日记,c++,单例模式

可以看到其地址一样,这就达到了我们要的效果

第一种写法:

引用+静态(将创建的单一对象放到全局静态区)(不推荐)

#include <iostream>

using std::cout;
using std::endl;
//单例模式的实现方式一:不推荐使用
class Point{
public:
    //实现了构造函数私有,即不可通过外部去创建对象
   //因为只有对象才能调用成员函数,故将该函数设计为静态函数
   //使其只能通过类名::进行调用
  static  Point  &getInstance()
   {
       //我们用引用的话,因为Point pt(1,2)是一个临时变量
       //其生命周期随着函数的消失而消失
       //故我们用static将其定义为全局静态对象即可返回引用
       /* static Point pt(1,2); */
       static Point pt;
       return pt;
   }
  void init(int x,int y)
  {
      _ix=x;
      _iy=y;
  }

    void print()
    {
        cout<<"("<<_ix
            <<","<<_iy
            <<")"<<endl;
    }
//私有化之后的构造函数只能在类内调用
private:
    Point(int ix=0 ,int iy=0)
    : _ix(ix)
      ,_iy(iy)
    {
        cout<<"Point(int,int)"<<endl;
    }
    int _ix;
    int _iy;
};
//全局对象也不能创建
/* Point pt3(1,3); */
void test(){
    //该对象不可能是一个栈对象
    /* Point pt1(1,2);//创建无数个对象 */
    /* Point pt2(3,4);//在语法上不能编译通过 */
    Point &pt = Point::getInstance();
    
    Point &pt2 = Point::getInstance();
    Point &pt3 = Point::getInstance();
    cout<<"pt:"<<&pt<<endl;
    cout<<"pt2:"<<&pt2<<endl;
    cout<<"pt3:"<<&pt3<<endl;
    pt.print();
    pt2.print();
}
int main()
{
    test();
    return 0;
}

第二种方式:

第一次调用getInstance函数时,直接new表达式创建堆对象

后续的调用直接返回第一次创建的对象即可

第二种写法是静态指针+静态数据成员(返回指针地址)

C++实现单例模式,C++学习日记,c++,单例模式C++实现单例模式,C++学习日记,c++,单例模式

代码:

#include <iostream>

using std::cout;
using std::endl;
//单例模式的实现方式二:推荐使用
class Point{
public:
    //第一次调用getInstance函数时,直接new表达式创建堆对象
    //后续的调用直接返回第一次创建的对象即可
  static  Point  *getInstance()
   {
       if(_pInstance == nullptr)
       {
       _pInstance = new Point;
       }
       return _pInstance;
   }
  static void destory()
  {
      if(_pInstance)
      {
          delete _pInstance;
          _pInstance = nullptr;
      }
  }
  void init(int x,int y)
  {
      _ix=x;
      _iy=y;
  }

    void print()
    {
        cout<<"("<<_ix
            <<","<<_iy
            <<")"<<endl;
    }
private:
Point(int ix=0 ,int iy=0)
    : _ix(ix)
      ,_iy(iy)
    {
        cout<<"Point(int,int)"<<endl;
}

~Point()
{
    cout<<"~Point()"<<endl;
}
//私有化之后的构造函数只能在类内调用
private:
    
    int _ix;
    int _iy;
    static Point *_pInstance;
};
//在全局静态区进行初始化
Point * Point::_pInstance = nullptr;
//全局对象也不能创建
/* Point pt3(1,3); */
void test(){
    //该对象不可能是一个栈对象
    /* Point pt1(1,2);//创建无数个对象 */
    /* Point pt2(3,4);//在语法上不能编译通过 */
    Point *pt = Point::getInstance();
    
    Point *pt2 = Point::getInstance();
    cout<<"pt:"<<pt<<endl;
    cout<<"pt2:"<<pt2<<endl;
    pt->print();
    pt2->print();

    //不能让该表达式编译通过
    /* delete  pt; */
    /* delete  pt2; //功能上可以实现,但是在代码形式上显得很突兀,不够优雅 */
    Point::destory();//完成对空间的回收
}
int main()
{
    test();
    return 0;
}

具体步骤:

  1. 在类中定义一个静态的指向本类型的指针 (该指针用来存储第一次调用静态成员函数getInstance创建出来的对象)

  2. 将构造函数私有化(不能在类之外直接调用)

  3. 在public区域,定义一个静态成员函数 (第一次调用该函数时,在该函数中new一个对象,后续的调用都是直接返回第一次创建的对象。)

应用场景:

  1. 单例模式可以用来替换全局对象类型

  2. 配置文件中的信息可以存储在单例对象中

  3. 网页库,倒排索引库都可以使用单例模式文章来源地址https://www.toymoban.com/news/detail-819600.html

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

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

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

相关文章

  • 13、c++使用单例模式实现命名空间函数

    本案例实现一个test命名空间,此命名空间内有两个函数,分别为getName()和getNameSpace(); 声明命名空间及函数 命名空间内实现单例类 实现一个单例类,构造函数要为private,自身对象为private 静态成员函数(才可以调用静态成员变量) 实现命名空间函数 首先调用的是类的静态

    2023年04月23日
    浏览(50)
  • 【c/c++】C++静态工具类和单例模式对比学习

    序言 比较C++ static(伪)静态(工具)类和单例模式的异同,方便工作中正确选用实现方式 说明:Java/C#等高级语言支持静态类,C++不直接支持静态类的概念,但是可以通过一些技巧来实现类似的功能:仅包含静态成员 + 私有构造函数防止类实例化,所以这里称其为伪静态类

    2024年02月19日
    浏览(37)
  • 【设计模式学习1】什么是单例模式?单例模式的几种实现。

    单例模式是在内存中只创建一个对象的模式,它保证一个类只有一个实例。 如上图所示,多线程情况下,在时刻T,线程A和线程B都判断single为null,从而进入if代码块中都执行了new Single()的操作创建了两个对象,就和我们当初的单例初衷相悖而行。 1、第一次判空目的:为了缩

    2024年02月15日
    浏览(56)
  • C++中特殊类的设计与单例模式的简易实现

    对于这种特殊类的设计我们一般都是优先考虑私有构造函数。 然后对于一些特殊要求就直接通过静态成员函数的实现来完成。  这里选择禁掉拷贝构造函数和拷贝函数是为了防止将已创建的对象去拷贝构造新的对象。  这里如果没有禁掉operator new和operator delete的话就会导致以

    2024年01月18日
    浏览(47)
  • 设计模式学习(一)单例模式的几种实现方式

    目录 前言 饿汉式 懒汉式 懒汉式DCLP 局部静态式(Meyers\\\' Singleton) 单例模板 参考文章 单例模式,其核心目标是确保在程序运行的过程中,有且只有存在一个实例才能保证他们的逻辑正确性以及良好的效率。因此单例模式的实现思路就是确保一个类有且只有一个实例,并提供

    2024年03月19日
    浏览(44)
  • C++并发编程(6):单例模式、once_flag与call_once、call_once实现单例

    参考博客 【C++】单例模式(饿汉模式、懒汉模式) C++单例模式总结与剖析 饿汉单例模式 C++实现 C++单例模式(饿汉式) 设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结 ,一共有23种经典设计模式 使用设计模式的目的 :为了代码可

    2024年02月16日
    浏览(66)
  • 学习系列:5种常见的单例模式变体及其实现方式

    单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供了一个全局访问点。在实际应用中,我们可能会遇到一些特殊情况,需要对单例模式进行一些变体,以满足不同的需求。下面介绍几种常见的单例模式变体。 1. 懒汉式单例模式 懒汉式单例模式是指在第一

    2024年02月09日
    浏览(49)
  • 【C++】设计模式-单例模式

    目录 一、单例模式 单例模式的三个要点 针对上述三要点的解决方案 常用的两类单例模式  二、懒汉模式实现 1.基本实现 2.锁+静态成员析构单例 3.双层检查锁定优化 4.双层检查锁定+智能指针 三、饿汉模式实现 1.基础实现 2.嵌套内部类解决内存泄漏 3.智能指针解决内存泄漏

    2024年02月16日
    浏览(38)
  • C++设计模式:单例模式(十)

    1、单例设计模式 单例设计模式,使用的频率比较高,整个项目中某个特殊的类对象只能创建一个 并且该类只对外暴露一个public方法用来获得这个对象。 单例设计模式又分懒汉式和饿汉式,同时对于懒汉式在多线程并发的情况下存在线程安全问题 饿汉式:类加载的准备阶段

    2024年04月14日
    浏览(47)
  • 【设计模式】C++单例模式详解

    ⼀个类仅有⼀个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。 那么,我们必须保证: 该类不能被复制;也不能被公开的创造。 对于 C++ 来说,它的构造函数,拷贝构造函数和赋值函数都不能被公开调用。 单例模式又分为 懒汉模式 和 饿汉模式 ,它们

    2024年02月05日
    浏览(48)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包