C++特殊类的设计

基于FPGA的心电信号实时处理与智能诊断系统实现【附源码解析】 本文详细介绍了基于FPGA的心电信号实时处理与智能诊断系统的设计与实现。系统通过高精度采集电路和FPGA数字滤波技术处理微弱心电信号,采用自适应算法准确检测QRS波群,实现心率计算和心律异常诊断。附源码解析展示了FIR滤波器、中值滤波器和诊断逻辑的Verilog实现,为心电监护系统开发提供实用参考。 阅读详情

title: C++特殊类的设计
date: 2024-08-12 10:55:17
tags:

原文及更多原创文章见我的网站: www.supdriver.top

接下来我们设计一些C++的常用特殊类,同时加深对C++类和对象的理解

设计一个不能被拷贝的类

拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝,只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。

C++98

将拷贝构造和赋值重载只私有声明且不定义即可

分析:

  1. 设为私有:防止类外调用,还能防止类外定义重新实现拷贝功能
  2. 只声明不定义:防止类内成员函数对其调用
//C++98
class NoCopy
{
private://设置成私有
	NoCopy(const NoCopy&);
	NoCopy& operator=(const NoCopy&);//只声明不定义
};

C++11

C++11扩展了delete关键字的用法,可用于删除成员函数,尤其是删除默认成员函数

//C++11
class CopyBan
{
	CopyBan(const CopyBan&) = delete;
	CopyBan& operator=(const CopyBan&) = delete;
};

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

既然涉及到类实例化成对象(如下图),势必绕不开构造函数,但实际上对类的设计者来说,通过控制构造函数来控制用户的行为难以实现。所以我们选择把拷贝构造函数禁掉,把赋值运算重载禁掉,把默认构造函数私有化,然后单独提供静态成员函数

class HeapOnly
{
public:
	static HeapOnly* GenerateObj()//提供静态成员函数
	{
		return new HeapOnly();
	}

private:
	HeapOnly();//私有化默认构造函数
	HeapOnly(const HeapOnly&) = delete;//禁掉拷贝构造
	HeapOnly& operator=(const HeapOnly&) = delete;//删除赋值运算重载
};

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

除了要把构造函数私有化,还要把operator new和operator delete重载禁掉,然后提供在返回栈上创建的对象的静态成员函数

赋值运算符重载函数只返回栈上的对象,所以不用管它

class StackOnly
{
public:
	static StackOnly CreatObj()
	{
		return StackOnly();//返回临时对象的拷贝
	}

private:
	StackOnly() {}

	StackOnly(const StackOnly&) = delete;

	void* operator new(size_t size) = delete;
	void operator delete(void* ptr) = delete;
};

设计一个类,不能被继承

C++98

将构造函数私有化,派生类中调用不到基类的构造函数,就会继承失败

class NoInherit
{
public:
	static NoInherit GenerateInstance()
	{
		return NoInherit();
	}
private:
	NoInherit() {}
};

C++11

C++11提供了final关键字,被final修饰的类不能被继承

class InheritBan final
{
    //...
};

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

单例模式:
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供一个
访问它的全局访问点,该实例被所有程序模块共享。比如在某个服务器程序中,该服务器的配置
信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再
通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。

懒汉方式最核心的思想是 “延时加载”. 从而能够优化服务器的启动速度.

饿汉方式实现

template <typename T>
class Singleton {
    static T data;
public:
    static T* GetInstance() {
        return &data;
    }
};

只要通过 Singleton 这个包装类来使用 T 对象, 则一个进程中只有一个static T 对象的实例.

懒汉方式实现

template <typename T>
class Singleton {
    static T* inst;//声明指针
public:
    static T* GetInstance() {
        if (inst == NULL) {
            inst = new T();
        }
        return inst;
    }
};

存在一个严重的问题, 线程不安全

因为inst是多个进程共享的资源,对其进行判空操作,也要用锁保护起来

线程安全的版本实现

// 懒汉模式, 线程安全
template <typename T>
class Singleton
{
    volatile static T *inst; // 需要设置 volatile 关键字, 否则可能被编译器优化->被放到寄存器中.
    static std::mutex lock;

public:
    static T *GetInstance()
    {
        if (inst == NULL)
        {                // 双重判定空指针, 降低锁冲突的概率, 提高性能.
            lock.lock(); // 使用互斥锁, 保证多线程情况下也只调用一次 new.
            if (inst == NULL)
            {
                inst = new T();
            }
            lock.unlock();
        }
        return inst;
    }
};

特别注意

  1. 加锁解锁的位置
  2. 双重if判定,避免不必要的锁竞争
  3. volatile关键字防止过度优化
上下文理解的AI增强方案:AI应用架构师的架构洞察 本文将从AI应用架构师的视角,深入探讨“上下文理解”的技术本质、核心挑战,以及一套可落地的上下文增强架构方案。我们会拆解上下文理解的底层需求,分析架构设计中的关键决策,并通过具体案例展示如何构建一个能“记住过去、理解现在、预测未来”的AI系统。三个维度:上下文的内容范围(短期/中期/长期)、数据类型(文本/结构化/多模态)、技术挑战(窗口限制/信息过载/跨会话一致性);三种架构模式:分层上下文存储(热/冷数据分离)、上下文路由(按需筛选)、动态压缩(适配模型窗口);四个关键组件。 阅读详情

相关推荐

python实现RsaWithSHA256签名以及国密Sm3WithSm2签名

【代码】python实现RsaWithSHA256签名以及国密Sm3WithSm2签名。

weixin_45005677的博客 3354

【C++】特殊类的设计、单例模式以及Cpp类型转换

本文深入探讨C++中特殊类的设计方法与类型转换机制。针对特殊类设计,详细解析如何实现禁止拷贝、限制对象创建于堆/栈、防止继承及单例模式(饿汉与懒汉),并分析其应用场景与线程安全问题。在类型转换部分,系统介绍C++四种强制转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)的原理与适用场景,剖析隐式转换的潜在风险(如数据截断与死循环),并对比C风格转换的缺陷。通过实例代码与场景分析,帮助开发者掌握高效、安全的编程实践,提升代码健壮性与可维护性。

2303_77756141的博客 2236

VMware ubuntu虚拟机(或Centos7)与主机共享文件夹

系统环境 Windows 10 Vmware Workstation 15 Pro Ubuntu 20.04.1 LTS centos7 1.Ubuntu配置共享文件 1.1安装VMware-tools 更新最新VMware-tools组件 编辑->首选项->更新->立即下载所有组件 安装VMware-tools 虚拟机->安装VMware-tools 安装后ubuntu会加载一个虚拟光驱,解压文件,在解压的文件目录下执行以下命令进行安装 sudo vmware-instal

weixin_38924500的博客 2160

[cpp进阶]C++特殊类设计

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有套路的,后来孙子就总结出了《孙子兵法》。孙子兵法也是类似。

weixin_53027918的博客 961

Jetson Orin Nano - SONY imx415 camera驱动开发

基于英伟达 Jetson orin nano 平台 imx415 camera驱动开发

hinewcc的博客 3246

层层剥开Allegro skill--快速抓取并写入Allegro软件【呕血创作,转载注明】

Allegro skill eda pcb

qq_36492361的博客 1255

C++11:特殊类设计和四种类型转换

RTTI:Run-time Type identification的简称,即:运行时类型识别。

weixin_51142926的博客 4337

步进电机驱动算法——梯形加减速算法

目录步进电机梯形加减速梯形加减速算法原理分析算法实现 步进电机梯形加减速 电机的控制方式一般分为开环控制与闭环控制两种控制方式,其中开环控制原理框图如下: 这种种控制方式的特点是:控制简单、实现容易、价格较低,这种开环控制方式,负载位置对控制电路没有反馈。 对于步进电机,控制脉冲的输入并不依赖于转子的位置,而是按一固定的规律发出控制脉冲,如果励磁变化太快,电机不能移动到新的位置,那么实际负载位置与理想位置就会产生一个偏差,就有可能出现失步或者过冲现象,所以需要使用加减速算法。 梯形加减速算法,S加减速算法等

aaa376070331的博客 3万+

【C++】特殊类设计

本篇文章介绍了五种C++类设计技巧:一、禁止拷贝的类,通过删除拷贝构造函数实现;二、堆上创建对象的类,将析构函数设为非公开并提供静态工厂方法;三、栈上创建对象的类,禁用new和delete;四、禁止继承的类,使用final关键字;五、单例模式的饿汉与懒汉实现。

是阿建吖! 2879

MIPS-5级流水线CPU

一、流水线CPU 流水线CPU就是指将一条分解为多步,在同一周期内进行多条指令的同时执行。MIPS五级流水线就是将指令分为:取指(IF),译码(ID),执行(EX),访存(MEM),写回(WB)五个阶段。举个例子: 比如第二条指令lui $t2,0x2100 在流水线CPU中执行的就是 可以看到在200-300ns的周期里,IF阶段取到0x00400004处的指令,300-400ns,这条指令到了ID阶段,而IF阶段执行下一条指令。400-500ns,执行这条指令,ALU的结果为0x2100

weixin_43877853的博客 2万+

如何获取SAP BTP账户及BAS启用

返回到 Service Marketplace 点击SAP Business Application Studio 然后go to Application。进入子用户的OverView里面找到Entitlements添加SAP Business Application Studio。注意:在选购BTP免费环境的时候,使用人要选公司才可以成功。在完成上述操作后,就可以登陆Cockpit。这里有SAP官方的BTP试用的手顺链接。配置权限※我绑定的是登录时的邮箱。※过程中有问题可以在评论区讨论。

wangshulong2013的博客 723

C++之特殊类设计

特殊类的设计:不可被拷贝的类,只能在堆上创建的类,只能在栈上创建的类,不可被继承的类,只能创建一个对象的类(单例)

. 1455

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

【C++】特殊类的设计

而。

stars_User的博客 1366

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++特殊类设计

本章我们主要讲解学习特殊类的设计方式。

~ 716

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++中一些特殊类的设计

为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是有。

wiketsy的博客 750

【C++学习】C++特殊类的设计

C++特殊类的设计

2301_77509762的博客 2117

C++ 特殊类的设计

摘要: 本文探讨了C++中特殊类设计的实现方法。首先分析了只能在堆上创建的类,通过私有化构造函数和析构函数实现;其次介绍了栈上创建类的限制方法,包括禁用operator new等技巧。文章还讲解了不能被继承的类(C++98私有构造函数/C++11 final关键字)、不能被拷贝的类的实现方案。最后重点阐述了单例模式的两种实现方式:饿汉模式(提前初始化)和懒汉模式(延迟加载)。全文通过代码示例展示了如何利用C++11特性(=delete、final等)简化特殊类设计,并强调了设计模式在解决特定问题中的价值。

hi0_6的博客 1458

《C++特殊类设计:单例模式》

介绍了C++特殊类的设计以及单例模式

qq_74319491的博客 842
上一篇: C++继承
下一篇: logSystemLinux日志系统
supdriver
博客等级 码龄3年 192粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值