c和c++下的接口不同形式

本文详细介绍了如何设计严谨且具有扩张性的接口,并通过导出函数、导出类及封装接口等方式确保内存管理的正确性,避免内存泄露。同时提供了实例代码演示,包括导出函数、导出类的实现,以及如何在封装接口中实现内存释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值