C++-设计一个特殊类

news2024/12/23 10:14:55


目录

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

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

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

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

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

        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.coloradmin.cn/o/1275817.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#中GDI+绘图应用(柱形图、折线图和饼形图)

目录 一、柱形图 1.示例源码 2.生成效果 二、折线图 1.示例源码 2.生成效果 三、饼形图 1.示例源码 2.生成效果 GDI绘制的一些常用的图形,其中包括柱形图、折线图和饼形图。 一、柱形图 柱形图也称为条形图,是程序开发中比较常用的一种图表技术…

【AI】数据集Dataloader制作

以花朵分类的数据集来进行测试。 Oxford 102 Flowers Dataset 是一个花卉集合数据集,主要用于图像分类,它分为 102 个类别共计 102 种花,其中每个类别包含 40 到 258 张图像。 该数据集由牛津大学工程科学系于 2008 年发布,相关论…

[原创]Delphi的SizeOf(), Length(), 动态数组, 静态数组的关系.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XXQQ: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi…

中学老师求职简历(精选9篇)

以下简历内容以中学老师招聘需求为背景,我们整理并修改了9篇全面、专业且具有参考价值的简历案例,大家可以灵活借鉴,希望能帮助大家在众多候选人中脱颖而出。 中学老师简历下载(可在下制作下载):百度幻主简…

表的创建和管理

表的创建和管理 一条数据的存储过程标识符的命名规则MySQL中的数据类型管理和创建数据库创建数据库使用数据库修改数据库 创建表创建方式1创建方式2查看数据表结构 修改表追加一个列修改一个列重命名一个列删除一个列 重命名表删除表清空表 一条数据的存储过程 存储数据是处理数…

pycharm closing卡住 解决办法

别处看到的,亲测有效 1.升级 pycharm 到 2023.3 2.pycharm 主页 Help -> Find Action -> 输入 Registry -> 禁用ide.await.scope.completion PyCharm 2023.1.2版本关闭后一直显示正在关闭项目 - 知乎

CentOS系统环境搭建(二十一)——安装git并且配置ssh拉取github代码

centos系统环境搭建专栏🔗点击跳转 文章目录 安装git并且配置ssh拉取github代码1.git初始配置2.设置ssh3.设置GitHub4.拉取代码 安装git并且配置ssh拉取github代码 1.git初始配置 安装 yum install git验证 git --version配置用户名(记得用你自己的…

C++中异常的栈展开概念

C中的异常栈展开是指,当某个函数中有异常产生(这里不考虑是主动抛出的还是被动产生的),在异常被捕获之前的函数调用链上,函数不会正常执行返回,即异常产生之后的程序逻辑不会被执行。 (注意&…

HarmonyOS开发准备(一) TypeScript基本语法

HarmonyOS开发准备(一) TypeScript基本语法 TypsScript官网:https://www.typescriptlang.org/play 可在官网 Playround 在线运行 Typescript 一、变量声明 // 创建 number(数值) 类型变量 let test_number: number 111 console.log(test_number:, tes…

教你把ChatGPT训练抖音爆款文案(附提示词)

刚好有圈子同学问到:如何把ChatGPT训练成1个抖音爆款写手,相信很多小伙伴日常也存在类似需求,用好一个GPT,让月薪5K的小助理快速变成3万月薪的运营。本期就给大家安排一期ChatGPT教程。接下来手把手演示ChatGPT调教和提示词方式一…

福州大学《嵌入式系统综合设计》实验十三:RTSP拉流与RTMP推流

一、实验目的 掌握基于算能平台的JPEG压缩编码方法以及开发环境,包括开发主机环境搭建,硬件嵌入式开发板的连接,云平台的配置,编码程序的编译、运行等。 二、实验内容 搭建实验开发环境,并编写静止图像jpeg格式编解…

如何在Python中对Dynamsoft Barcode Reader性能进行基准测试

Dynamsoft Barcode Reader SDK一款多功能的条码读取控件,只需要几行代码就可以将条码读取功能嵌入到Web或桌面应用程序。这可以节省数月的开发时间和成本。能支持多种图像文件格式以及从摄像机或扫描仪获取的DIB格式。使用Dynamsoft Barcode Reader SDK,…

ThinkPHP 2.x任意代码执行漏洞

任务一: 复现环境中的代码漏洞 任务二: 尝试利用代码执行漏洞读取服务器web目录下的文件列表。 任务一: 1.搭建环境: 2.在php环境下直接输入{${phpinfo}}测试代码片段 2.写入一句话木马,用antsword连接&#xff0…

Java数据结构之《循环队列》题目

一、前言: 这是怀化学院的:Java数据结构中的一道难度中等的一道编程题(此方法为博主自己研究,问题基本解决,若有bug欢迎下方评论提出意见,我会第一时间改进代码,谢谢!) 后面其他编程题只要我写完…

夯实c基础

夯实c基础 区别: 图一的交换,(交换的是地址而不是两数)无法实现两数的交换。 题干以下程序的输出结果为( c  )。 void fun(int a, int b, int c){ ca*b; } void main( ){ int…

【Unity】Blender场景导入

素材 下载场景:https://www.aplaybox.com/details/model/keDSIks72Qh3 blender文件导出为.fbx文件,路径选择复制(做的过程太乱了不知道有没有影响),物理类型选择网格,勾选应用变换 blender下的物体长度是u…

openbabel 安装 生成指纹方法

今日踩坑小结: openbabel 安装: 可以装,但是得在 Linux 环境下,win 环境装会报错(安装不会报错,但是生成指纹的时候会) 指纹: 在下面这个链接里,官方给出了命令行调用 o…

袖珍可穿戴手持气象仪是什么?

随着科技的不断发展,我们身边的世界正在变得越来越智能化。近日,一款名为WX-SQ12可穿戴手持气象仪的科技新品引起了人们的广泛关注。这款气象仪不仅具有创新性的可穿戴设计,还具备强大的气象数据监测功能,让用户可以随时掌握天气变…

nvm安装管理nodejs版本

1:如果之前先安装了nodejs先卸载nodejs 2:下载nvm,点击下载路径https://github.com/coreybutler/nvm-windows/releases,选择相应环境下载,如下window环境下载 下载成功后,选择NVM安装在哪个文件目录下&…

【图论】重庆大学图论与应用课程期末复习资料2-各章考点(计算部分)(私人复习资料)

图论各章考点 二、树1、避圈法(克鲁斯克尔算法)2、破圈法3、Prim算法 四、路径算法1、Dijkstra算法2、Floyd算法 五、匹配1、匈牙利算法(最大权理想匹配(最小权权值取反)) 六、行遍性问题1、Fleury算法&…