简单接口实现规范 联系客服

发布时间 : 星期六 文章简单接口实现规范更新完毕开始阅读

3、 客户的使用:Client.dsp I、

Extern.h

class CExtern { }

private:

IFoo*

m_pFoo;

public:

CExtern() {m_pFoo = NULL;} void CreateIFoo(); void UseIFoo();

void NotUserIFooNever();

第9页 共68页

II、 Extern.cpp

// 后面有一章“一些规范”里会解释这个路径

#include “../Include/IFoo.h” #include “Extern.h” void CExtern::CreateIFoo() { }

void CExtern::UseIFoo() { }

if (m_pFoo)

。。。// 为阅读,省略了一些加栽dll的代码 if (!CreateFoolObject(&m_pFoo);

m_pFoo = NULL;

m_pFoo->AddName(“Test”);

void CExtern::NotUseIFooNever() {

if (m_pFoo) { }

}

m_pFoo->Release(); m_pFoo = NULL;

三、 先实例化服务,再实例化客户

有时,先实例化服务,然后再实例化客户。例如:我们的游戏服务器和游戏框架,就是采用这种方式。此时,由服务调用客户的创建函数,并将自己的接口指针做为参数传给客户。

第10页 共68页

第三节 接口对象的销毁

接口对象的销毁,不应该由客户用delete来完成。

一般,接口对象都提供一个Release(或close)虚函数,自己负责销毁自己。 这个可以从上面例子可以看出,如果用下面的下法: void CExtern::NotUseIFooNever() {

if (m_pFoo) { }

那么,对于CExtern,它只看到了IFoo这片内存区,是不知道有m_listName这样一个动态列表的对象的,所以当调用delete m_pFoo时,m_listName是无法删除的,这样只能产生内存泄露。

所以,必须而且只能由对象自己完成销毁工作,就如上例中实现的NotUserIFooNever()中调用的一样。

同时,还有一个范例说明,销毁应该由对象自己完成:即DLL的运行期库问题。 参看:《Windows核心编程》(ISBN:7-111-07945-0)P465和P131。

下面有一个简单的程序,大家可以调试以下: ? 包括不调用Release()函数 ? 去掉Release()里的delete this

? 将main()里的pInterface->Release()注释,换成下面的delete pInterface 看一下内存和~CDestruction()的调用情况,可以较详细地了解简单接口。 // TestInterfaceDestruction.cpp : Defines the entry point for the console application. //

第11页 共68页

delete m_pFoo; m_pFoo = NULL;

}

#include \#include #include

#define new DEBUG_NEW

class IDestruction { public: };

class CDestruction : public IDestruction { public: public:

virtual void Release() {

第12页 共68页

// 为了检测内存泄露,只能使用DEBUG_NEW

virtual void Release() = 0; virtual void Create() = 0; virtual void Cal() = 0;

CDestruction() { };

m_piA = 0;

m_piB = 0;

~CDestruction() { };

int c = 1;