引用计数类

it2022-05-09  24

引用计数类头

#pragma once

class CImageInfoData{ friend class CImageInfo;public: CImageInfoData(void); ~CImageInfoData(void); void operator = (CImageInfoData &info); CImageInfoData(CImageInfoData &info);public: void set(void *image);private: void newVal(void *image); void deleteVal();private: void *image; unsigned refCount;};

引用计数实现

#include "stdafx.h"#include "ImageInfoData.h"

CImageInfoData::CImageInfoData(void){ newVal(NULL); refCount = 0;}

CImageInfoData::~CImageInfoData(void){ deleteVal();}

void CImageInfoData::operator = (CImageInfoData &info){ deleteVal(); newVal(info.image);}

CImageInfoData::CImageInfoData(CImageInfoData &info){ refCount = 0; newVal(info.image);}

void CImageInfoData::newVal(void *image){ this->image = image;}

void CImageInfoData::deleteVal(){ if(image != NULL) {  delete image; }}

void CImageInfoData::set(void *image){ deleteVal(); newVal(image);}数据类头

#pragma once

#include "ImageInfoData.h"

class CImageInfo{public: CImageInfo(void); ~CImageInfo(void); void operator = (CImageInfo &info); CImageInfo(CImageInfo &info);public: void set(void *image); void *Image();private: void attachData(CImageInfoData *theData); void detachData();public: BITMAPINFO header;private: CImageInfoData *data;};

数据类实现

#include "stdafx.h"#include "ImageInfo.h"

CImageInfo::CImageInfo(void){ attachData(NULL);}

CImageInfo::~CImageInfo(void){ detachData();}

void CImageInfo::operator = (CImageInfo &info){ detachData(); attachData(info.data); memcpy(&header,&info.header,sizeof(BITMAPINFO));}

CImageInfo::CImageInfo(CImageInfo &info){ attachData(info.data); memcpy(&header,&info.header,sizeof(BITMAPINFO));}

void CImageInfo::attachData(CImageInfoData *theData){ if(theData == NULL) {  //no data to attach to ,make new data  data = new CImageInfoData; }else if(theData->refCount == UINT_MAX) {  //avoid reference count overflow, make new data  data = new CImageInfoData;  set(theData->image); }else {  //simply attach to data  data = theData; }

 ++data->refCount;}

void CImageInfo::detachData(){ if(--data->refCount == 0) {  delete data;  data = NULL; }}

void CImageInfo::set(void *image){ if(data->refCount > 1) {  attachData(NULL); }

 data->set(image);}

void *CImageInfo::Image(){ return data->image;}

转载于:https://www.cnblogs.com/nanshouyong326/archive/2009/09/03/1559611.html


最新回复(0)