c和c++下的接口不同形式
2015-08-10 16:22
405 查看
通常接口是纯虚函数的,外部在使用已经编辑好的接口的时候只需要知道一个h文件盒一个dll即可那么在这种前提之下,如何编写接口严谨,扩张性强的接口以下是几点需要说明的1> 导出函数:返回指向派生类的纯虚函数接口2> 导出类:在派生类的声明的时候在类名的前面加上到处的关键之 _delspec(dllexport)3> 将不同的纯虚函数接口封装到一个导出类中(分两种不同的情形)4> 通常在实例化派生类的时候是在封装好的接口中实现的,所以外部直接使用即可,但这样大部分的用户会忘记releaseobj,造成内存泄露///接口说明
#define DLL_EXPORT __declspec(dllexport) class IInterFaceBase { public: virtual void ReleaseObj() = 0; }; class IInterFace:public IInterFaceBase { public: virtual void fun1() = 0; virtual void fun2() = 0; }; class IInterFaceRst:public IInterFaceBase { public: virtual void funrst1() = 0; virtual void funrst2() = 0; };1:导出函数
DLL_EXPORT IInterFace* getObjDevide(); DLL_EXPORT IInterFaceRst* getObjRst();
<pre name="code" class="cpp">DLL_EXPORT IInterFace* getObjDevide() { return new CDevide; } DLL_EXPORT IInterFaceRst* getObjRst() { return new CRst; }2:导出类
<pre name="code" class="cpp">#pragma once#include "InterFace.h"class CDevide : public IInterFace{public: CDevide(void); ~CDevide(void); //devide virtual void ReleaseObj(); virtual void fun1(); virtual void fun2();};class CRst:public IInterFaceRst{public: CRst(); ~CRst(); //devide virtual void ReleaseObj(); virtual void funrst1(); virtual void funrst2();};3:封装接口
class DLL_EXPORT CInterFace{public: CInterFace(); ~CInterFace(); IInterFace* getDeviceInter(); IInterFaceRst* getRstInter();private: IInterFace *_InterDevice; IInterFaceRst *_InterRst;};
//CInterFaceCInterFace::CInterFace(){ printf("CInterFace::CInterFace()\n"); _InterDevice = getObjDevide(); _InterRst = getObjRst();}CInterFace::~CInterFace(){ printf("CInterFace::~CInterFace()\n"); _InterDevice->ReleaseObj(); _InterRst->ReleaseObj();}IInterFace* CInterFace::getDeviceInter(){ return _InterDevice;}IInterFaceRst* CInterFace::getRstInter(){ return _InterRst;}将内存的释放写到析构中,这样就不会出现内存泄露的情况了但是封装接口还有一种形式就是在构造里面_InterDevice = new CDevice; _InterRst = new CRst;具体怎么用看用户自己的选择使用说明:
#include "BaseHead.h"#include <Windows.h>void fun(){ CInterFace obj;}int main(){#if 0//interface IInterFace *pInter = getObjDevide(); pInter->fun1(); pInter->fun2(); IInterFaceRst *pRst = getObjRst(); pRst->funrst1(); pRst->funrst2(); pInter->ReleaseObj(); pRst->ReleaseObj();#else//class fun();#endif system("pause"); return 0;}总结:两种方式都行,注意要在析构函数中释放内存还有一种释放内存的方式就是针对每一个接口类写自己的虚析构函数,那么这种情况下是不需要再派生类中重写的,在编码上节约了很多代码,在封装好的使用类中只需要在析构中delete 基类指针即可#define DLL_EXPORT __declspec(dllexport)class IInterFaceBase{public:virtual void ReleaseObj() = 0;};class IInterFace:public IInterFaceBase{public:virtual void fun1() = 0;virtual void fun2() = 0;};class IInterFaceRst:public IInterFaceBase{public:virtual void funrst1() = 0;virtual void funrst2() = 0;};//派生类
class CDevide : public IInterFace{public: CDevide(void); ~CDevide(void); //devide virtual void ReleaseObj(); virtual void fun1(); virtual void fun2();};class CRst:public IInterFaceRst{public: CRst(); ~CRst(); //devide virtual void ReleaseObj(); virtual void funrst1(); virtual void funrst2();};
相关文章推荐
- 浮点类型的自然输出
- [leetcode-95]Unique Binary Search Trees II(c++)
- C语言中指针的指针是如何工作的?
- C++基类与派生类的转换
- C/C++中字符串与数字之间的转换
- C++中关于类与对象的学习
- 条件运算符嵌套
- C++虚函数及虚函数表简析
- C++“准”标准库Boost学习指南-variant的使用
- fscanf函数
- C语言关键字register、extern、static、一些总结
- 【C++类型转换】static_cast, dynamic_cast, const_cast探讨
- C语言文件输入数组输出小代码
- C++_模板的实例化与具体化。
- [c语言]输入三个单词,输出最长单词
- 解决c/c++的sequence points和side effects问题
- [leetcode-96]Unique Binary Search Trees(c++)
- &&和||优先级
- c++ i++和++i的区别
- c++域操作符