设计类网站建设规划书,设计商城网站建设,外贸网站建设是什么,合肥网站建设公司 招聘GitHub - ros2/demos at foxy 一、说明 为了研究ROS2的组件编程#xff0c;首先要理解如何何为组件。组件本是微软的发明物体#xff0c;但是在ubuntu上需要自己从底层实现#xff0c;就说ROS2不用你写#xff0c;但是就能看明白也是需要一点理论功底的。本篇按照COM内幕的…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(){ coutFx1enl;}virtual void Fx2(){ coutFx2enl;}virtual void Fy1(){ coutFy1enl;}virtual void Fy2(){ coutFy2enl;}
}; 以上代码是个比喻是展现实现的效果至于如何实现下面的设计更巧。 在上面实现中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.hvoid 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(){ coutCA::Fx1enl;}virtual void Fx2(){ coutCA::Fx2enl;}virtual void Fy1(){ coutCA::Fy1enl;}virtual void Fy2(){ coutCA::Fy2enl;}
};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_