C++高级用法—使用boost::shared_ptr来创建共享指针对象并保持了多态性的特性

1. Introdution

本文我们将使用了boost::shared_ptr来创建共享指针对象,并且实现多态的功能。

2.Example
#include <iostream>
#include <boost/thread.hpp>
#include <boost/chrono.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition_variable.hpp>

class Layer{
    public: 
       virtual void print(){ std::cout<<"Layer Init...!"<<std::endl;};

};

class obstacle_layer:public Layer
{  
   void  print()
   {
     std::cout << "Obstacle layer Init...!" << std::endl;
   }

};

class static_layer:public Layer
{
    void print()
    {
        std::cout << "static layer Init...!"<< std::endl;
    }


};

class inflation_layer:public Layer
{
   public:
      int a_;
      const char* s_;
      inflation_layer(int a,const char* s):a_(a),s_(s){}

      void print()
      {
         std::cout<<"inflation layer Init...!"<<"Current Progress is:"<<a_<<" "<<s_<<"."<<std::endl;
      }
};



int main() {
    
   //初始化障碍物层
   boost::shared_ptr<Layer> pluginObstacle(new obstacle_layer()); 
   pluginObstacle->print();

   //初始化静态层
   boost::shared_ptr<Layer> pluginStatic(new static_layer());
   pluginStatic->print();
   
   //初始化膨胀层 
   boost::shared_ptr<Layer> pluginInflation(new inflation_layer(100,"%"));
   pluginInflation->print();


    return 0;
}

首先,我们创建了三个共享指针对象 pluginObstaclepluginStaticpluginInflation

  • pluginObstacle 指向 obstacle_layer 的对象。
  • pluginStatic 指向 static_layer 的对象。
  • pluginInflation 指向 inflation_layer 的对象。

由于 obstacle_layerstatic_layerinflation_layer 都是 Layer 类的子类,因此可以将它们作为 Layer 类型的指针进行使用。这就实现了多态性,即可以通过基类的指针来操作不同派生类的对象。
这样,就可以使用基类的指针对象来操作派生类的对象,并且在运行时动态地选择适当的函数实现。这就是使用多态性的一种常见做法。

3.为社么要使用共享指针?

使用共享指针(Shared Pointer)主要有以下好处:

  1. 内存管理:共享指针的核心作用是实现对动态分配内存的自动管理。在C++中,共享指针对象会自动处理对象的创建和删除,避免了手动管理内存的复杂性。这可以降低程序出现内存泄漏的风险,提高程序的稳定性。

  2. 资源借用:共享指针实现了资源的无缝借用。多个对象可以共享同一个资源,从而减少内存占用和提高程序运行效率。当一个对象不再被使用时,共享指针会自动回收资源,避免资源的浪费。

  3. 对象生命周期管理:共享指针内置了对象的生命周期管理功能,可以方便地跟踪和管理对象的生命周期。当一个对象被多次引用时,共享指针会确保对象在所有引用都被清除后自动删除,避免了内存泄漏和悬挂指针等问题。

  4. 智能指针:C++11引入了智能指针的概念,智能指针是一种更高级的共享指针,它可以在对象被销毁前自动管理资源。这使得智能指针在处理动态内存分配和资源管理方面更加高效和便捷。

  5. 降低程序耦合度:使用共享指针可以降低程序中对象之间的耦合度。通过共享指针,可以将对象的创建和销毁交给运行时系统自动处理,使得对象之间的依赖关系更加简单和清晰。

  6. 便于并发编程:共享指针有利于实现并发编程。在多线程环境下,共享指针可以确保对象的正确访问和同步,从而降低并发编程的复杂性。

总之,使用共享指针可以提高程序的可维护性、稳定性和性能,降低内存泄漏风险,简化对象生命周期管理,并有助于实现并发编程。在实际项目中,熟练掌握和运用共享指针技术对于提升

4.Performance

(1)我们将上述代码文件命名为virtual.cpp。
(2)然后在ubuntu系统下执行如下命令:

g++ -std=c++11 virtual.cpp -lpthread -lboost_system -lboost_thread -o virtual

(3)然后执行:

./virtual

(4)运行结果如下:

在这里插入图片描述

Relatedworks
  1. C++ vector 使用类作为模板参数/C++多态展示
  2. C++ Boost Thread 编程总结
  3. C++类中运算符(operator())的重载
  4. C++boost线程唤醒

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/216362.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言每日一题(45)删除排序链表中的重复元素

力扣网83 删除排序链表中的重复元素 题目描述 给定一个已排序的链表的头 head &#xff0c; 删除所有重复的元素&#xff0c;使每个元素只出现一次 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入&…

软件验收计划书

软件项目验收计划的作用主要有以下几点&#xff1a; 确保项目质量&#xff1a;通过项目验收&#xff0c;客户或相关方可以对项目的成果进行全面、系统的评估&#xff0c;以确保项目达到预期的质量标准。 发现和解决问题&#xff1a;在项目开发过程中&#xff0c;难免会存在一些…

【刷题日志】牛客 HJ73 计算日期到天数转换

计算日期到天数转换 阅读题目解题方案 及 解题思路方法一 . 手撕日期类方法二 . 分别直接算出平年和闰年每个月的时间 并对应下标存入数组中&#xff0c;判断该年份为平年还是闰年&#xff0c;再 for循环依次求和优化&#xff1a;也不用分别算出平年和闰年的每个月的时间&#…

基于yolov8-paddleocr-车牌识别

1 介绍 使用yolov8模型进行车牌区域识别&#xff0c;然后使用paddlecor模型将字体提取出来&#xff0c;由于数据量很大&#xff0c;支持复杂环境下的识别。数据集共29642张&#xff0c;其中27642张用了做训练&#xff0c;2000张用来做验证。 2 训练yolov8模型 yolov8详细介绍…

技术or管理?浅谈软件测试人员的未来职业发展,值得借鉴

我们在工作了一段时间之后&#xff0c;势必会感觉到自己已经积累了一些工作经验了&#xff0c;会开始考虑下一阶段的职业生涯会如何发展。测试人员在职业生涯中的不确定因素还是不少的&#xff0c;由于其入门门槛不高&#xff0c;不用学习太多技术性知识即可入行&#xff0c;所…

在 AlmaLinux 9.2 上安装Oracle Database 23c

在 AlmaLinux 9.2 上安装Oracle Database 23c 1. 安装 Oracle Database 23c2. 连接 Oracle Database 23c3. 重启启动后&#xff0c;手动启动数据库4. 重启启动后&#xff0c;手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开机启动数据…

MT8390商显广告机主板_MTK联发科安卓主板方案开发

商显广告机采用MediaTek 联发科平台主板方案。安卓主板具有更高的性能、更丰富的接口、更多的存储空间以及更为便捷的网络连接方式&#xff0c;可以满足更为复杂的开发和应用需求使其应用领域更加多元化&#xff0c;被广泛应用于各行各业。 商显广告机主板基于联发科MT8390八核…

【C++】运算符重载

加号运算符重载 #include <iostream> using namespace std; class Person { public:// 成员函数实现运算符重载// Person operator(Person &p)// {// Person temp;// temp.a this->a p.a;// temp.b this->b p.b;// return temp;// }int a…

深入解析Linux进程管理机制

本文将深入探讨Linux操作系统中的进程管理机制&#xff0c;重点介绍进程的创建、调度和终止过程&#xff0c;以及进程间的通信方式。通过对进程相关概念和机制的全面解析&#xff0c;读者将能够更好地理解和应用Linux进程管理&#xff0c;提升系统的性能和可靠性。 引言 Linux作…

力扣7.整数反转

题目描述 代码 自己写的像屎山&#xff0c;虽然能通过&#xff0c;但多了很多不必要的代码。 class Solution {public int reverse(int x) {int count 0;int res 0;//用temp2记录x的正负int temp2 x;if(x < 0){x -x;}int temp x;while(temp ! 0){temp temp / 10;cou…

如何开发代码生成器平台?分享下思路

大家好&#xff0c;我是鱼皮&#xff0c;我的新项目 《鱼籽 - 定制化代码生成项目》 系列教程正式开始&#xff01; 本次项目依然是从 0 到 1 带大家开发&#xff0c;会遵循企业项目开发的标准流程&#xff1a;需求分析 > 技术选型 > 项目设计 > 项目初始化 > Demo…

数据挖掘与低代码开发应用:加速业务创新的黄金组合

数据挖掘与低代码开发是当今创新领域的两大热点技术。数据挖掘技术可以从大量数据中发现隐藏的模式和知识&#xff0c;为决策提供有力支持&#xff1b;而低代码开发则使得应用程序的开发变得更加快捷和高效。本文将介绍数据挖掘和低代码开发的概念及其应用&#xff0c;并阐述它…

无限移动的风景 css3 动画 鼠标移入暂停

<style>*{margin:0;padding:0;/* box-sizing: border-box; */}ul{list-style: none;}#nav{width:900px;height:100px;border:2px solid rgb(70, 69, 69);margin:100px auto; overflow: hidden;}#nav ul{animation:moving 5s linear infinite;width:200%; /*怎么模拟动画…

隐写2-MISC-bugku-解题步骤

——CTF解题专栏—— 声明&#xff1a;文章由作者weoptions学习或练习过程中的步骤及思路&#xff0c;非正式答案&#xff0c;仅供学习和参考。 题目信息&#xff1a; 题目&#xff1a;隐写2 作者&#xff1a;harry 提示&#xff1a;f1g{xxx} 解题附件&#xff1a; 解题思路…

年底了,项目预算怎么创建?9个步骤直接搞定

如果将项目比作一辆汽车&#xff0c;那么预算就是它的燃料。就像汽车需要汽油一样&#xff0c;项目也需要资金和资源来维持运转。而作为项目经理&#xff0c;应该尽量用最有效的方式规划和使用这些资源&#xff0c;使项目按时交付。 项目预算是一项计划&#xff0c;其中详细说…

软件测试常见并发问题有哪些?

1、前言 经常有人问&#xff0c;性能测试是不是就是并发测试&#xff1f;答案是否&#xff0c;性能测试和并发测试是两个概念&#xff0c;且并发测试不等同于性能测试。 今天我们就来详细讲讲什么是并发测试&#xff0c;以及解析实际的项目中常见的并发问题。 2、并发测试的…

SpringBoot集成i18n(多语言)

配置文件 spring: messages: basename: il8n/messages # 配置国际化资源文件路径 fallback-to-system-locale: true # 是否使用系统默认的语言环境作为备选项 国际化配置 import org.springframework.context.annotation.Bean; import org.spr…

赛事回顾 | 首届“智航杯“全国无人机智能算法竞赛落幕

11月28日&#xff0c;首届“智航杯”全国无人机智能算法竞赛实物赛在海南省三亚市成功落下帷幕。此次竞赛自2023年4月启动以来&#xff0c;共有来自全国145所高等院校和50多所企事业单位的1253支团队、3655人报名参赛&#xff0c;最终有6支队伍脱颖而出&#xff0c;入围了实物赛…

赴日程序员高年薪过上“躺平”生活?

日本的IT行业想要达到的高薪&#xff0c;也是需要很多资历和经验的&#xff0c;不过即使你是新卒&#xff0c;也能拿到相比国内来说让你满意的薪资。 刚入职的起薪是20-23万日元/月&#xff0c;情报信息业出身&#xff0c;技术掌握不错&#xff0c;起薪是25万-30万日元。之后经…

强化学习——简单解释

一、说明 最近 OpenAI 上关于 Q-star 的热议激起了我温习强化学习知识的兴趣。这是为强化学习 (RL) 新手提供的复习内容。 二、强化学习的定义 强化学习是人类和其他动物用来学习的学习类型。即&#xff0c;通过阅读房间来学习。&#xff08;从反馈中学习&#xff09;。让我解…