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

【BOOST C++】组件编程(2)-- 组件的设计原理

GitHub - ros2/demos at foxy

一、说明

        为了研究ROS2的组件编程,首先要理解如何何为组件。组件本是微软的发明物体,但是在ubuntu上需要自己从底层实现,就说ROS2不用你写,但是就能看明白也是需要一点理论功底的。本篇按照COM内幕的理论为线索,一点一点实现它们的示例,以达到理解的目的。

二、为什么要有组件?

        理解组件编程,需要回顾程序软件的历史,在历史上,软件是逐步老化,淘汰的过程,每当就的软件过时了,就需要重新开发。这种开发是重头走一回。但是,在软件的逐步淘汰过程中,它是某些局部环节不能满足需求,并不是全部环节一起老化,因而,只需要局部升级就可以继续使用,那么,如何实现,组件就成了针对的专门设计。

        组件设计是一种隔离的思路,是将应用程序、接口、接口实现分开进行设计的。如图:

  •         1 接口规定形式,组件实现内容
  •         2 一个组件可以有多接口。
  •         3 多个组件可以有共同的接口,但接口的内容各自组件,各自规定。
  •         4 接口定义好一般就不改了。需要新功能时可以追加接口、追加组件。
  •         5 由于组件内实现了接口,接口生存周期要长于组件。

 

        客户端调用组件

         以上模式至少实现了:

  • 客户端和组件分隔
  • 组件和接口分割
  • 接口和接口实现分隔
  • 各自维护互不影响

三、接口实现原理

        接口的实现原理:

class IX{                       //first interface
public:virtual void Fx1()=0;virtual void Fx2()=0;
};class Iy{                        //second interface
public:virtual void Fy1()=0;virtual void Fy2()=0;
};class CA:public Ix,public Iy{public:virtual void Fx1(){ cout<<"Fx1"<<enl;}virtual void Fx2(){ cout<<"Fx2"<<enl;}virtual void Fy1(){ cout<<"Fy1"<<enl;}virtual void Fy2(){ cout<<"Fy2"<<enl;}      
};

        以上代码是个比喻,是展现实现的效果,至于如何实现,下面的设计更巧。 

        在上面实现中Ix和Iy是实现接口的纯抽象类。该类内部仅仅包含纯虚函数,这个函数仅仅用来指针占位,并无实质的实现。

        为了实现纯虚函数的实体,在组件CA中继承两个接口Ix和Iy,在CA中实现了虚函数的集体化。可以将抽象类看成是空的表单,在派生类(CA)中实现表单填写。

 四、实质的接口定义

4.1 首先定义一个接口符号

        在objbase.h中,定义了一个interface的名词术语。

    #define interface struct

        注意:这里interface定义成struct,是因为在struct内的成员全部是public无需特殊生命

4.2 更真实的接口定义

#ifndef __OBJBASE__
#define __OBJBASE__#include <objbase.h>
interface IX{                       //first interfacevirtual void Fx1()=0;virtual void Fx2()=0;
};interface Iy{                        //second interfacevirtual void Fy1()=0;virtual void Fy2()=0;
};#endif

 4.3 一个实例

ca.cpp


#include <istream.h>
#include <objbase.h>void trace(const char *pMsg ) {cout <<pMsg <<endl;}interface IX{                       //first interfacevirtual void Fx1()=0;virtual void Fx2()=0;
};interface Iy{                        //second interfacevirtual void Fy1()=0;virtual void Fy2()=0;
};class CA:public Ix,public Iy{public:virtual void Fx1(){ cout<<"CA::Fx1"<<enl;}virtual void Fx2(){ cout<<"CA::Fx2"<<enl;}virtual void Fy1(){ cout<<"CA::Fy1"<<enl;}virtual void Fy2(){ cout<<"CA::Fy2"<<enl;}      
};int main(){CA *pA = new CA;
trace("this is client call component ");
Ix *pIx = pA;trace("client: use the Ix interface");
pIx->Fx1();
pIx->Fx2();
trace("client: use the Iy interface");
pIy->Fy1();
pIy->Fy2();
trace("client:delete  interface");delete pA;
return 0;
}

输出: 

this is client call component
client: use the Ix interface
CA::Fx1
CA::Fx2
client: use the Iy interface
CA::Fy1
CA::Fy2
client:delete  interface

五、结论

        客户端调用组件,组件调用接口,接口调用接口的实现,每一步都有一个节点环节,这样就使得【客户端】与【接口实现】这两个实质性的程序不产生关系,达到独立维护的目的。

        当客户程序和组件在一个源文件中时,并无必要将其分开。但当客户和组件是在动态链接库中时,此种隔离是必须的。下章将进一步隔离抽象,让客户端不再使用CA的指针。

参考资料

 [转]C/C++:构建你自己的插件框架 - Merlin-magic - 博客园 (cnblogs.com)

COM编程入门不得不看的文章 :第一部分 什么是COM,如何使用COM_

相关文章:

【BOOST C++】组件编程(2)-- 组件的设计原理

GitHub - ros2/demos at foxy 一、说明 为了研究ROS2的组件编程&#xff0c;首先要理解如何何为组件。组件本是微软的发明物体&#xff0c;但是在ubuntu上需要自己从底层实现&#xff0c;就说ROS2不用你写&#xff0c;但是就能看明白也是需要一点理论功底的。本篇按照COM内幕的…...

基于单细胞多组学数据无监督构建基因调控网络

在单细胞分辨率下识别基因调控网络&#xff08;GRNs&#xff0c;gene regulatory networks&#xff09;一直是一个巨大的挑战&#xff0c;而单细胞多组学数据的出现为构建GRNs提供了机会。 来自&#xff1a;Unsupervised construction of gene regulatory network based on si…...

蓝桥杯-最优清零方案(2022省赛)

蓝桥杯-最优清零方案1、问题描述2、解题思路3、代码实现1、问题描述 给定一个长度为 N 的数列 1,2,⋯,A1,A2,...,ANA_1,A_2,...,A_NA1​,A2​,...,AN​ 。现在小蓝想通过若干次操作将 这个数列中每个数字清零。 每次操作小蓝可以选择以下两种之一: 1. 选择一个大于 0 的整数, 将…...

Mac免费软件下载网站推荐(最全免费,替代MacWk)

一、Appstorrent 官方网站&#xff1a; https://appstorrent.ru/ 这是一个俄语网站&#xff0c;其他很多网站资源都来自这里。点击右上角切换到中文。不需要登录网站&#xff0c;直接从软件详情页下载即可。体验非常好。 二、Xclient 官方网站&#xff1a; https://xclie…...

GPU是什么

近期ChatGPT十分火爆&#xff0c;随之而来的是M国开始禁售高端GPU显卡。M国想通过禁售GPU显卡的方式阻挡中国在AI领域的发展。 GPU是什么&#xff1f;GPU&#xff08;英语&#xff1a;Graphics Processing Unit&#xff0c;缩写&#xff1a;GPU&#xff09;是显卡的“大脑”&am…...

20230305学习计划

目录 第二天学习开发框架 前言 一、巩固复习第一天20230304学习笔记 二、SpringMVC中的控制器是不是单例模式&#xff1f;如果是&#xff0c;如何保证线程安全&#xff1f; 1、控制器是单例模式&#xff0c;是线程不安全的。 2、Spring中保证线程安全的方法&#xff1a; …...

SocketCan 应用编程

SocketCan 应用编程 由于 Linux 系统将 CAN 设备作为网络设备进行管理&#xff0c;因此在 CAN 总线应用开发方面&#xff0c;Linux 提供了SocketCAN 应用编程接口&#xff0c;使得 CAN 总线通信近似于和以太网的通信&#xff0c;应用程序开发接口更加通用&#xff0c;也更加灵…...

从零学习python - 04函数方法与返回值

函数&#xff1a;Function-也称为方法&#xff0c;是组织好的、可重复使用的&#xff0c;用来实现指定功能的代码块。函数的定义与调用:创建函数目的是封装业务逻辑&#xff0c;实现代码复用# 创建函数关键字:def(definition)def fun1(x, y):print(x y)函数的参数:python函数中…...

MySQL实战之事务到底是隔离的还是不隔离的

1.前言 我们在MySQL实战之事务隔离&#xff1a;为什么你改了我还看不见讲过事务隔离级别的时候提到过&#xff0c;如果是可重复读隔离级别&#xff0c;事务T启动的时候会创建一个视图read-view,之后事务T执行期间&#xff0c;即使有其他事务修改了数据&#xff0c;事务T看到的…...

Elasticsearch:理解 Master,Elections,Quorum 及 脑裂

集群中的每个节点都可以分配多个角色&#xff1a;master、data、ingest、ml&#xff08;机器学习&#xff09;等。 我们在当前讨论中感兴趣的角色之一是 master 角色。 在 Elasticsearch 的配置中&#xff0c;我们可以配置一个节点为 master 节点。master 角色的分配表明该节点…...

【致敬女神】HTMLReport应用之Unittest+Python+Selenium+HTMLReport项目自动化测试实战

HTMLReport应用之UnittestPythonSeleniumHTMLReport项目自动化测试实战1 测试框架结构2 技术栈3 实现思路3.1 使用HtmlTestRunner3.2 使用HTMLReport4 TestRunner参数说明4.1 源码4.2 参数说明5 框架代码5.1 common/reportOut.py5.2 common/sendMain.py5.3 report5.3.1 xxx.htm…...

JAVA的16 个实用代码优化小技巧

一、类成员与方法的可见性最小化 举例&#xff1a;如果是一个private的方法&#xff0c;想删除就删除。 如果一个public的service方法&#xff0c;或者一个public的成员变量&#xff0c;删除一下&#xff0c;不得思考很多。 二、使用位移操作替代乘除法 计算机是使用二进制…...

并发编程的三大挑战之原子性及其解决方案

目录 一、原子性问题 1、带来原子性问题的原因 2、如何解决线程切换带来的原子问题 2.1、使用synchronized关键字来保证 2.2、使用CAS来保证原子性 2.3、使用lock锁来保证 一、原子性问题 1、带来原子性问题的原因 线程切换是带来原子的根本原因&#xff0c;java的并发程…...

QML动画(其他的动画)

PauseAnimation &#xff08;暂停动画&#xff09; 为动画提供暂停 Rectangle{id:rect1width: 100;height: 100;x:100;y:100color: "lightBlue"SequentialAnimation{running: trueColorAnimation {target: rect1&#xff1b;property: "color"&#xff1b;…...

Spark 配置项

Spark 配置项硬件资源类CPU内存堆外内User Memory/Spark 可用内存Execution/Storage Memory磁盘ShuffleSpark SQLJoin 策略调整自动分区合并自动倾斜处理配置项分为 3 类: 硬件资源类 : 与 CPU、内存、磁盘有关的配置项Shuffle 类 : Shuffle 计算过程的配置项Spark SQL : Spar…...

掌握Vue3模板语法,助你轻松实现高效Web开发

Vue3作为前端开发中的一种主流框架&#xff0c;为我们提供了多种灵活的方式来处理模板语法。除了基础的模板语法&#xff0c;Vue3还提供了一些高级的语法&#xff0c;可以让我们更好地处理组件、响应式数据和UI逻辑等。在这篇博客中&#xff0c;我们将介绍Vue3中的一些高级模板…...

Jmeter+Ant+Jenkins接口自动化测试平台搭建

平台简介一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter支持接口的测试&#xff0c;Ant支持自动构建&#xff0c;而Jenkins支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动化测…...

ncnn部署(CMakelists.txt)

1. NCNN 环境安装 参考博客: 基于ncnn的yolov5模型部署 1. 1 protobuf编译 打开VS2013/VS2019的X64命令行(注意不是cmd),我这里以V32013环境进行编译 > cd <protobuf-root-dir> > mkdir build-vs2013 > cd build-vs2013 > cmake -G"NMake Makefil…...

SQL分库分表

什么是分库分表&#xff1f; 分库分表是两种操作&#xff0c;一种是分库&#xff0c;一种是分表。 分库分表又分为垂直拆分和水平拆分两种。 &#xff08;1&#xff09;分库&#xff1a;将原来存放在单个数据库中的数据&#xff0c;拆分到多个数据库中存放。 &#xff08;2&…...

大数据分析案例-基于逻辑回归算法构建微博评论情感分类模型

🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章 大数据分析案例合集…...

运筹优化算法工程师入门指南:从数学基础到实战项目(附学习资源清单)

运筹优化算法工程师入门指南&#xff1a;从数学基础到实战项目&#xff08;附学习资源清单&#xff09; 运筹优化&#xff08;Operations Research&#xff09;作为一门融合数学建模与工程实践的学科&#xff0c;正在供应链管理、智能制造、交通调度等领域展现出不可替代的价值…...

DAMOYOLO-S保姆级教学:Gradio自定义组件添加‘清空缓存’按钮实操

DAMOYOLO-S保姆级教学&#xff1a;Gradio自定义组件添加‘清空缓存’按钮实操 1. 引言&#xff1a;为什么需要“清空缓存”按钮&#xff1f; 如果你用过DAMOYOLO-S这个目标检测模型&#xff0c;可能会发现一个不大不小的问题&#xff1a;连续上传多张图片进行检测后&#xff…...

Easegress全方位监控指南:构建云原生流量可观测性系统的终极方案

Easegress全方位监控指南&#xff1a;构建云原生流量可观测性系统的终极方案 【免费下载链接】easegress A Cloud Native traffic orchestration system 项目地址: https://gitcode.com/gh_mirrors/eas/easegress Easegress是一个强大的云原生流量编排系统&#xff0c;专…...

SDMatte开源大模型部署教程:supervisor托管+自动恢复,企业级稳定性保障

SDMatte开源大模型部署教程&#xff1a;supervisor托管自动恢复&#xff0c;企业级稳定性保障 1. SDMatte模型介绍 SDMatte是一款专注于高质量图像抠图的AI模型&#xff0c;特别擅长处理复杂边缘和半透明物体的提取任务。无论是电商商品图、设计素材还是专业摄影作品&#xf…...

教育场景实践:OpenClaw+GLM-4.7-Flash自动批改作业与生成评语

教育场景实践&#xff1a;OpenClawGLM-4.7-Flash自动批改作业与生成评语 1. 为什么选择OpenClaw做教育自动化 去年冬天&#xff0c;当我连续第三周熬夜批改学生提交的Python作业时&#xff0c;突然意识到这种重复劳动正在吞噬我的创造力。直到在GitHub偶然发现OpenClaw&#…...

BEV感知算法实战:从Mono3D到PointPillars的自动驾驶3D目标检测全解析

BEV感知算法实战&#xff1a;从Mono3D到PointPillars的自动驾驶3D目标检测全解析 自动驾驶技术的核心挑战之一是如何让车辆准确理解周围环境。在众多感知方案中&#xff0c;鸟瞰图&#xff08;BEV&#xff09;感知因其独特的空间表示优势&#xff0c;正在成为行业主流技术路线。…...

解决MathType在Word中加载失败的终极指南:从运行时错误53到MathPage.WLL缺失

1. 遇到MathType加载失败时先别慌 最近有不少朋友在系统升级后遇到了MathType无法正常加载的问题。作为一个经常和公式打交道的科研狗&#xff0c;我完全理解这种崩溃感——论文deadline近在眼前&#xff0c;公式编辑器却罢工了。最常见的两种报错是&#xff1a;"Please r…...

CANoe CAPL实战:putvalue和getvalue函数在汽车总线测试中的高效应用

CANoe CAPL实战&#xff1a;putvalue和getvalue函数在汽车总线测试中的高效应用 在汽车电子测试领域&#xff0c;CANoe作为主流的测试工具&#xff0c;其CAPL编程语言的高效运用直接决定了测试效率和质量。对于经常与CAN总线打交道的测试工程师来说&#xff0c;putvalue和getva…...

动态代理·学习笔记

“嗨,阿米戈。” “你好,瑞希。” “今天我将向您解释一个非常有趣的新话题:动态代理”。 “Java 有几种方法可以改变特定类的功能……” “第一个方法,传承。” “更改类行为的最简单方法是创建一个继承原始(基)类的新类,并覆盖其方法。然后,使用派生类而不是原始…...

4步解锁迅雷链接自由:Thunder-HTTPS转换工具全攻略

4步解锁迅雷链接自由&#xff1a;Thunder-HTTPS转换工具全攻略 【免费下载链接】thunder-https 专业的迅雷专用链转换工具&#xff0c;可将thunder://开头的加密链接转换为可直接使用的HTTP/HTTPS下载地址。支持Windows/macOS双平台&#xff08;lite版本支持全平台&#xff09;…...