简单的c++回调函数实现办法:
最近为公司升级schematic编辑器,GUI部分采用QT来实现,为了防止GUI采用的开发库的变化,决定采用
GUI+Engine的办法实现,GUI部分用Qt来实现,Engine使用C++来实现作为library,gui运行时链接engine库。Qt提供signal/slot机制可以提供比回调函数更方便的通讯方式,此处就不再赘述。此处简单介绍一下engine和Gui层的回调函数实现办法。
在项目开发中发现很多地方需要通过回调来实现,实现办法有很多种,例如函数指针,c++的虚函数,boost 的functor仿函数等,这里提供一种利用c++模板来实现的办法,下面绘制来作为例子,library提供画线,画点,画矩形,画字符串的接口。
先介绍一下其它的实现办法:
1: 函数指针:
了解linux kernel对设备驱动管理的对函数指针肯定不陌生:
library中定义接口
- struct RGB{
- unsigned int r;
- unsigned int g;
- unsigned int b;
- };
- typedef struct _drawFp_{
- int (*drawPoint)(int x,int y,RGB rgb);
- int (*drawLine)(int sx,int sy,int ex,int ey,RGB rgb);
- int (*drawRect)(int left,int top,int width,int height,bool fill,RGB rgb);
- int (*drawString)(const char *str,int x,int y,int font,RGB rgb);
- }drawFPointer;
这样在GUI层中需要实现对应的四个函数(注意参数和返回值的一致性):
- int gui_drawPoint(int x,int y,RGB rgb)
- {
-
- }
- int gui_drawLine(int sx,int sy,int ex,int ey,RGB rgb)
- {
-
- }
- int gui_drawRect(int left,int top,int width,int height,bool fill,RGB rgb)
- {
-
- }
- int gui_drawString(const char *str,int x,int y,int font,RGB rgb)
- {
-
- }
-
- drawFPointer gui_drawFPoint = {
- gui_drawPoint,
- gui_drawLine,
- gui_drawRect,
- gui_drawString,
- };
把这个gui_drawFPoint传递给library即可。
2:虚拟函数
在library中实现接口
- class CDrawFPoint
- {
- public:
- CDrawFPoint();
- ~CDrawFPoint();
- virtual int drawPoint(int x,int y,RGB rgb) = 0;
- virtual int drawLine(int sx,int sy,int ex,int ey,RGB rgb) = 0;
- virtual int drawRect(int left,int top,int width,int height,bool fill,RGB rgb) = 0;
- virtual int drawString(const char *str,int x,int y,int font,RGB rgb) = 0;
- };
在gui中实现继承此类
- class GuiCDrawFpoint : public CDrawFPoint
- {
- public:
- GuiCDrawFpoint(){}
- ~GuiCDrawFpoint(){}
- int drawPoint(int x,int y,RGB rgb){return 1;}
- int drawLine(int sx,int sy,int ex,int ey,RGB rgb){return 1;}
- int drawRect(int left,int top,int width,int height,bool fill,RGB rgb){return 1;}
- int drawString(const char *str,int x,int y,int font,RGB rgb){return 1;}
- };
同样把实例化指针传递给library即可,当然gui中也可以直接继承此类。