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