GitHub - ros2/demos at foxy
为了研究ROS2的组件编程,首先要理解如何何为组件。组件本是微软的发明物体,但是在ubuntu上需要自己从底层实现,就说ROS2不用你写,但是就能看明白也是需要一点理论功底的。本篇按照COM内幕的理论为线索,一点一点实现它们的示例,以达到理解的目的。
理解组件编程,需要回顾程序软件的历史,在历史上,软件是逐步老化,淘汰的过程,每当就的软件过时了,就需要重新开发。这种开发是重头走一回。但是,在软件的逐步淘汰过程中,它是某些局部环节不能满足需求,并不是全部环节一起老化,因而,只需要局部升级就可以继续使用,那么,如何实现,组件就成了针对的专门设计。
组件设计是一种隔离的思路,是将应用程序、接口、接口实现分开进行设计的。如图:
客户端调用组件
以上模式至少实现了:
接口的实现原理:
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"<
以上代码是个比喻,是展现实现的效果,至于如何实现,下面的设计更巧。
在上面实现中Ix和Iy是实现接口的纯抽象类。该类内部仅仅包含纯虚函数,这个函数仅仅用来指针占位,并无实质的实现。
为了实现纯虚函数的实体,在组件CA中继承两个接口Ix和Iy,在CA中实现了虚函数的集体化。可以将抽象类看成是空的表单,在派生类(CA)中实现表单填写。
在objbase.h中,定义了一个interface的名词术语。
#define interface struct
注意:这里interface定义成struct,是因为在struct内的成员全部是public无需特殊生命。
#ifndef __OBJBASE__
#define __OBJBASE__#include
interface IX{ //first interfacevirtual void Fx1()=0;virtual void Fx2()=0;
};interface Iy{ //second interfacevirtual void Fy1()=0;virtual void Fy2()=0;
};#endif
ca.cpp
#include
#include void trace(const char *pMsg ) {cout <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_