对象生命期管理系统

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值