C++使用纯虚函数的接口封装以及接口的调用方法

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中。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值