您的位置:首页 > 其它

对象生命期管理系统

2004-11-15 11:15 316 查看
5.	对象生命期管理系统
//第一个参数接口类,第二个参数具体类
template<class I,class C>//接口指针模板
class SIP{
public:

//从实现类的一个接口映射到另一个接口
template<class I2>
SIP<I2,C> Cast()
{
return SIP<I2,C>(_c);
}

explicit
//从一个已经存在(带参构造)的具体类,映射到智能接口指针
SIP(C * c):_c(c){
_i=static_cast<I *>(c);
_i->AddRef();
};

//无参构造,用于具体类 没有构造函数的情况
explicit
SIP():{
_c=new C;
_i=static_cast<T *>(_c);
_i->AddRef();
}	;

SIP(SIP<I,C> & p){  //CCTOR
_i=p.get();
_c=p.get2();

_i->AddRef();

cout<<"cctor"<<endl;
cout<<_i->ct();

};

SIP<I,C>& operator=(SIP<I,C> &  p)
{
_i=p.get();
_c=p.get2();
_i->AddRef();
cout<<"operator ="<<endl;
cout<<_i->ct();

};

I & operator*() const
{	// return designated value
return (*_i);
}

I *operator->() const
{	// return pointer to class object
return (&**this);
}

I *get() const
{	// return wrapped pointer
return (_i);
}

C *get2() const
{	// return wrapped pointer
return (_c);
}

~SIP()
{
_i->Release();
};
private:
I * _i; //接口指针
C * _c;//具体类指针

};

template<class I,class C> //把一个具体类的指针映射到一个智能接口指针 SIP
SIP<I,C>  Cast(C * c)
{
return SIP<I,C>(c);

};

interface IUnknown{

virtual int  AddRef( void) = 0;
virtual int  Release( void) = 0;
};

#define DECLARE_IUNKNOWN()		/
public:							/
virtual int  AddRef( void)		/
{								/
count++;					/
return 0;					/
};								/
virtual int  Release( void)		/
{								/
count--;					/
if (count==0) {				/
delete this;				/
}							/
return 0;					/
};								/
public:						/
int count;

main.cpp
#include "stdafx.h"
#include "global_datastruct.h"

#include "SentenceManager.h"
using namespace std;

typedef SIP<ISentenceManager,CSentenceManager> PISentenceManager

PISentenceManager  a()
{
CSentenceManager * ps=new CSentenceManager ;//带构造参数的具体类(指针)
PISentenceManager p=Cast<ISentenceManager>(ps);//映射到一个SIP

cout<<"ct:";
cout<<ps->count;
return PISentenceManager(p);//构造一个临时的SIP
}

void b()
{
PISentenceManager p(a()); //用一个临时的SIP构造一个新的SIP

PISentenceManager p2=p; //用一个SIP对另一个SIP赋值

cout<<"ct:";
cout<<p->ct();
p2->Display_the_sentence();

//接口映射,将一个内含一个接口的SIP中的接口,映射到对象支持的另一个接口

typedef SIP<I2,CSentenceManager> PI2

PI2 pp=p.Cast<I2>();
cout<<"ct:";
pp->show();
}

int _tmain(int argc, _TCHAR* argv[])
{
b();

int x;
cin>>x;
return 0;
}

输出:
ct:1copy construct
2copy construct
2ct:2do shmeying on CSentenceManager
0012FCD4
ct:T2
ct:0
destoried
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: