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