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

如何定义一个只能在堆上或栈上生成对象的类

在C++中,可以通过特定的技术手段来控制对象只能在堆(heap)或栈(stack)上创建。

只能在堆上创建对象的类

要实现这一点,我们需要阻止用户直接实例化对象,而只能通过new操作符创建。

class HeapOnly {
public:static HeapOnly* create() {return new HeapOnly();}// 删除拷贝构造函数和赋值运算符HeapOnly(const HeapOnly&) = delete;HeapOnly& operator=(const HeapOnly&) = delete;private:HeapOnly() {}  // 构造函数私有化~HeapOnly() {} // 析构函数私有化
};

原理

  1. 将构造函数和析构函数设为私有,防止直接实例化

  2. 提供静态工厂方法create()来创建对象

  3. 删除拷贝构造函数和赋值运算符防止复制

只能在栈上创建对象的类

要实现这一点,我们需要阻止用户使用new操作符创建对象。

class StackOnly {
public:StackOnly() {}/ 禁止普通的 new 和 deletevoid* operator new(size_t) = delete;void operator delete(void*) = delete;// 禁止 new[] 和 delete[]void* operator new[](size_t) = delete;void operator delete[](void*) = delete;// 禁止 placement new(防止绕过限制)void* operator new(size_t, void*) = delete;
};

原理

  1. 删除new和delete操作符的重载,使得无法使用new创建对象

  2. 仍然允许在栈上直接实例化对象

注意事项

  1. 对于只能在堆上创建的类,需要提供某种方式来释放内存,通常是在类中添加一个destroy()方法:

    void destroy() {delete this;
    }
  2. 这些技术在现代C++中可以通过=delete语法简洁地实现,但在旧版C++中需要通过声明为private并不实现的方式达到类似效果。

  3. 这些限制会影响类的使用方式,在设计时需要权衡灵活性和约束。


文章转载自:
http://aleuronic.bdypl.cn
http://breakout.bdypl.cn
http://bassein.bdypl.cn
http://amphipathic.bdypl.cn
http://astronautics.bdypl.cn
http://beadle.bdypl.cn
http://brevet.bdypl.cn
http://centaurus.bdypl.cn
http://buccinator.bdypl.cn
http://cacanny.bdypl.cn
http://attritus.bdypl.cn
http://chromous.bdypl.cn
http://camaraderie.bdypl.cn
http://boogiewoogie.bdypl.cn
http://admass.bdypl.cn
http://carnet.bdypl.cn
http://caver.bdypl.cn
http://aborted.bdypl.cn
http://anabasin.bdypl.cn
http://aeneid.bdypl.cn
http://beguine.bdypl.cn
http://chief.bdypl.cn
http://bloodcurdling.bdypl.cn
http://bessarabian.bdypl.cn
http://breathlessly.bdypl.cn
http://appurtenances.bdypl.cn
http://alveolitis.bdypl.cn
http://chammy.bdypl.cn
http://bullheaded.bdypl.cn
http://biparietal.bdypl.cn
http://www.dtcms.com/a/281147.html

相关文章:

  • Python初学者笔记第十二期 -- (集合与字典编程练习题)
  • U-Boot 中增加 GIC-400中断服务程序
  • Copula理论:覆盖相关性分析、极值相依性、回归建模、时间序列预测、贝叶斯网络,R/Python双语言实现+AI编程辅助(科研绘图与结果呈现)
  • Nestjs框架: 数据库多租户模式与动态模块初探
  • Oracle日期时间函数说明及与MySql区别说明
  • 同济医院R语言训练营第三期开讲!上交大张维拓老师主讲
  • RabbitMQ工作流程
  • SQL学习记录01
  • 15.图像 模板轮廓检测
  • 李白周游记50篇
  • linux-develop
  • 基于Alpine构建MySQL镜像
  • 第二阶段-第二章—8天Python从入门到精通【itheima】-129节(MySQL的安装)
  • 【前后端】Node.js 模块大全
  • 巨坑检查无误还报错is not mapped MappingException: Unknown entity:@Entity
  • DeepSWE:通过强化学习扩展训练开源编码智能体
  • 多层 `while` 循环中,`break` 的行为
  • ES2023 新特性解析_数组与对象的现代化操作指南
  • 二分查找栈堆
  • 【C语言进阶】字符函数和字符串函数的内部原理
  • “ModuleNotFoundError“深度解析:Python模块导入问题的终极指南
  • PHP语言基础知识(超详细)第二节
  • OSPFv3中LSA参数
  • dbever 导出数据库表的建表语句和数据插入语句
  • 嵌入式Linux:进程间通信机制
  • AJAX 开发中的注意点
  • ASRPRO系列语音模块(第十天)
  • AI 增强大前端数据加密与隐私保护:技术实现与合规遵
  • Python 程序设计讲义(2):Python 概述
  • pc浏览器页面语音播报功能