C++使用纯虚函数的接口封装以及接口的调用方法
受疫情的影响,本研狗最近一直在家养老,但是,实验室那边的项目突然压下来了,无奈,只好云办公呗。给的任务是对我之前完成的项目做一个封装,对外部提供接口使用。这**就涉及到我知识的盲区了呀,时间还催的挺紧,只好这两天边学边做,终于肝出来了一个初步的成果,做好了空的原型库定义,加上了要求的输入输出参数,封装成了接口。然后想着趁着热乎劲,赶紧把方法总结下来,遂发布了这篇文章,供大家参考,也给以后自己再写类似接口的时候当参考。
首先说一下为什么要用到纯虚函数,主要是因为要向用户提供接口,又不希望暴露太多的信息,于是在对外部发布的头文件里定义的方法都是纯虚的,也不包含私有方法和属性,而其具体实现以及成员变量由内部封装的库来实现。简单来说,就是要发布的外部文件定义抽象类当作父类,其内部子类继承父类,提供具体实现。
下面我整了一个很简单的小例子来说明这个是如何实现的,例子是调用opencv实现图片的水平翻转和灰度化操作。
小例子的代码均已上传到github:传送门
库的封装
首先,是对外发布的接口文件image_processing.h,如下所示。
// ------------------image_processing.h------------------
// 这个是对外发布的接口,这个文件里只包含对外提供的方法,不会包含私有方法和属性
#pragma once
#include <opencv2/opencv.hpp>
// 注:如果用到了.def来配置生成dll,则可以用下面被注释掉的代码
//#ifdef _EXPORTING
//#define CLASS_DECLSPEC __declspec(dllexport)
//#else
//#define CLASS_DECLSPEC __declspec(dllimport)
//#endif
#define CLASS_DECLSPEC __declspec(dllexport) // 表示这里要把类导出
// 基类
class Processing // 这个类是对外发布的,所有方法均是纯虚的,不会暴露实现
{
public:
// 提供接口框架的纯虚函数
virtual void imageProcessing(cv::Mat image) = 0; // 图像处理
virtual cv::Mat getTheResult() = 0; // 输出成员变量
// 这里最好不要出现私有成员变量,因为只是接口作用,不暴露实现,成员变量可以在具体实现头文件定义
};
可以看到,这个类里面只有一个成员函数,virtual的声明表示这个函数是纯虚的,还有后面的 = 0也要加上,告诉编译器这是个纯虚函数。
细心的童鞋可能就发现了,上面注释了一大段#define这些东西是什么鬼?解释一下,这个跟一个.def的配置文件有关,这个配置文件一般用于生成dll,也就是我们现在正在做的事情。这段注释意思是如果.def中define _EXPRORTING,就用__declspec(dllexport)来替代CLASS_DECLSPEC;如果没有define,就用__declspec(dllimport)来替代CLASS_DECLSPEC。
关于__declspec(dllexport)这个东西,它表示的是声明一个导出函数(或者导出类),是说这个函数(类)要从本DLL导出,表示要给别人用,一般用于生成dll。而__declspec(dllimport)是声明一个导入函数(或者导入类),是说这个函数(类)是从别的DLL导入,一般用于使用某个dll的exe中。


4647

被折叠的 条评论
为什么被折叠?



