通常接口是纯虚函数的,外部在使用已经编辑好的接口的时候只需要知道一个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;
};
//CInterFace
CInterFace::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();
};