发布时间 : 星期六 文章简单接口实现规范更新完毕开始阅读
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
#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;