// C++ Primer 14.6
ScrPtr类是一个只供ScreenPtr使用的类,提供一个智能指针。
如果不适用智能指针,直接在class ScreenPtr中定义一个成员变量Screen*ptr,则无法对ptr进行引用计数的管理.
Notes: 在ScrPtr类中的引用计数 use, 表示的是ScrPtr的引用次数,而不是该类的一个指针的引用计数。
#include "stdafx.h"
#include <iostream>
#include <cassert>
using namespace std;
class Screen{};
// private class, only used in class ScreenPtrclass
class ScrPtr{
public:ScrPtr(Screen *p):sp(p), use(1)
{}
~ScrPtr()
{
delete sp;sp = NULL;
}
void AddRef()
{
assert(use >= 1);use++;
}
void Release()
{
assert(use >= 1);
if(--use == 0)
{
delete this;
}
}
friend class ScreenPtr;
private:
Screen *sp;
int use;
};
class ScreenPtr
{
public:
ScreenPtr(Screen *p):ptr(new ScrPtr(p))
{}
ScreenPtr(const ScreenPtr &orig): ptr(orig.ptr)
{
ptr->AddRef();
}
ScreenPtr& operator=(const ScreenPtr &orig)
{
if (this == &orig)
return *this;
if(ptr)
ptr->Release();
ptr = orig.ptr;
ptr->AddRef();
return *this;
}
~ScreenPtr()
{
ptr->Release();
ptr = NULL;
}
bool operator==(const ScreenPtr &orig)
{
return ptr == orig.ptr;
}
bool operator!=(const ScreenPtr &orig)
{
return ptr != orig.ptr;
}
private:
ScrPtr *ptr;
};
int _tmain(int argc, _TCHAR* argv[])
{
Screen *pScreen = new Screen();
ScreenPtr screenPtr(pScreen);
Screen *pScreen2 = new Screen();
ScreenPtr screenPtr2(pScreen2);
screenPtr2 = screenPtr;
system("Pause");
return 0;
}