当前位置: 首页 > article >正文

C++-设计一个特殊类


目录

一.设计一个类,不能被拷贝

二.设计一个类只能在堆上创建对象

三.设计一个类只能在栈上创建对象

四. 请设计一个类,不能被继承

五.请设计一个类,只能创建一个对象(单例模式)

        1.单例模式:

       2. 饿汉模式


一.设计一个类,不能被拷贝

        只需要让该类不能在类外调用该类的拷贝构造函数以及赋值重载函数即可。

        C++98:


class CopyBan
{
    // ...
    
private:
    CopyBan(const CopyBan&);
    CopyBan& operator=(const CopyBan&);
    //...
};

        C++11

class CopyBan
{
    // ...
    CopyBan(const CopyBan&)=delete;
    CopyBan& operator=(const CopyBan&)=delete;
    //...
};

二.设计一个类只能在堆上创建对象

        实现方式:

                1. 将类的构造函数私有,拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。

                2. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建

class HeapOnly    
{     
public:     
    static HeapOnly* CreateObject()  
   {      
        return new HeapOnly;    
   }
private:    
    HeapOnly() {}
    
    // C++98
    // 1.只声明,不实现。因为实现可能会很麻烦,而你本身不需要
 // 2.声明成私有
    HeapOnly(const HeapOnly&);
    
    // or
        
    // C++11    
    HeapOnly(const HeapOnly&) = delete;
};

三.设计一个类只能在栈上创建对象

        

class StackOnly
{
public:
 static StackOnly CreateObj()
 {
 return StackOnly();
 }
    
    // 禁掉operator new可以把下面用new 调用拷贝构造申请对象给禁掉
 // StackOnly obj = StackOnly::CreateObj();
 // StackOnly* ptr3 = new StackOnly(obj);
 void* operator new(size_t size) = delete;
 void operator delete(void* p) = delete;
private:
 StackOnly()  
 :_a(0)
 {}
private:
 int _a;
};

        也可以同第二个中的通过静态方法返回对象,来实现从栈上创建对象。

四. 请设计一个类,不能被继承

// C++98中构造函数私有化,派生类中调不到基类的构造函数。则无法继承
class NonInherit
{
public:
 static NonInherit GetInstance()
 {
 return NonInherit();
 }
private:
 NonInherit()
 {}
};

//C++11
class A  final
{
    // ....
};

五.请设计一个类,只能创建一个对象(单例模式)

        1.单例模式:
                一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个 访问它的全局访问点,该实例被所有程序模块共享 。比如在某个服务器程序中,该服务器的配置 信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再 通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。
单例模式有两种实现模式:
        
       2. 饿汉模式
                就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。
// 饿汉模式
// 优点:简单
// 缺点:可能会导致进程启动慢,且如果有多个单例类对象实例启动顺序不确定。
  class Singleton
 {
  public:
      static Singleton* GetInstance()
     {
          return &m_instance;
     }
private:
     // 构造函数私有
    Singleton(){};
    
    // C++98 防拷贝
    Singleton(Singleton const&); 
    Singleton& operator=(Singleton const&); 
      
    // or
      
    // C++11
    Singleton(Singleton const&) = delete; 
    Singleton& operator=(Singleton const&) = delete; 
  
    static Singleton m_instance;
 };
  
  Singleton Singleton::m_instance;  // 在程序入口之前就完成单例对象的初始化
}

         3.懒汉模式

                用来解决饿汉模式中带来的缺点。

                


http://www.kler.cn/a/152692.html

相关文章:

  • 【高效开发工具系列】Hutool DateUtil工具类
  • ARM安全架构——为复杂软件提供保护
  • 设计模式:观察者模式
  • es6之class类(未完成)
  • K8s Docker实践三
  • Python开发运维:PyMongo 连接操作 MongoDB
  • 【Openstack Train安装】十二、Cinder安装
  • 力扣每日一题(2023-11-30)
  • drool 7 multiThread 测试
  • java分布式锁分布式锁
  • 鉴源论坛 · 观擎丨民机机载软件的配置管理
  • 【Android MediaCodec 将音频转换为 pcm 格式】
  • ModuleNotFoundError: No module named ‘mdtex2html‘ module已经安装还是报错,怎么办?
  • 利用python实现文件压缩打包的功能
  • 国际上有哪些比较出名的VOIP供应商
  • 计算两个经纬度之间的实际距离(Haversine公式)----c++
  • Python语言学习笔记之七(JOSN应用)
  • conda和pip常用命令整理
  • css加载会造成阻塞吗??
  • Linux 系统启动过程