//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, Beijing Tangent Software Co. Ltd. // = FileName : TSafeResource.cpp // = Version : ver2.0 // = Author : xlc // = CreateDate : 2002-09-09 // = Description: 类的定义 // = Maintainers: // //-----------------------------------------------------------------------------+ #include "StdAfx.h" #include "TSafeResource.h" TSafeResource::TSafeResource() { pReferCount = new int(1); } void TSafeResource::Attach(TSafeResource&source) { Detach(); if(source.IsAttached()) { pReferCount=source.pReferCount; Apply(source); IncreaseRef(); } } TSafeResource::TSafeResource(TSafeResource&source)//获取资源 { Attach(source); } TSafeResource& TSafeResource::operator=(TSafeResource&source) { //只要不是自身赋值,则获取资源 //防止自身赋值时引用计数错误增大。 if ((&source) != this) { Attach(source); } return *this; } void TSafeResource::Detach() { //<放弃资源> //如是资源的最后一个用户,释放资源。 //如果资源为空,则不进行任何操作。 //多次调用完全等同于一次调用。 if(IsAttached()) { DecreaseRef(); if(CanRelease()) { Release(); delete pReferCount; } pReferCount=NULL; } } TSafeResource::~TSafeResource() { //如果子类重载了Apply或者Release,则其析构函数必须调用Detach。 Detach(); } void TSafeResource::Apply(TSafeResource&source) { } void TSafeResource::Release() { } void TSafeResource::IncreaseRef() { (*pReferCount)++; } void TSafeResource::DecreaseRef() { (*pReferCount)--; } bool TSafeResource::CanRelease() { return (*pReferCount) == 0; } bool TSafeResource::IsLastRefer() { return (*pReferCount) == 1; } bool TSafeResource::IsAttached() { return pReferCount != NULL; }