定义 含有计数器的智能类模板如下:
template class SmartObjectPtr {
private:
T* p;
public:
SmartObjectPtr(T* p_=NULL) : p(p_) { if (p) p->AddRef(); };
SmartObjectPtr(const SmartObjectPtr &p_) : p((T*)p_) { if (p) p->AddRef(); };
~SmartObjectPtr(void) { if (p) p->Release(); };
SmartObjectPtr& operator=(SmartObjectPtr &p_) { return operator=((T*)p_); };
SmartObjectPtr& operator=(T* p_)
{
// must take care the order, if release p first, then add ref to
// p_ may fail if p_ == p, cause release p may delete p_ !!!
if (p_) p_->AddRef();
if (p) p->Release();
p = p_;
return this;
};
bool operator==(SmartObjectPtr &p_) { return operator==((T)p_); };
bool operator==(T* p_) { return p == p_; };
bool operator!=(SmartObjectPtr &p_) { return operator!=((T*)p_); };
bool operator!=(T* p_) { return p != p_; };
operator T*(void) const { return p; };
operator T*(void) { return p; }; // new
T& operator*(void) { return p; };
T operator->(void) { return p; };
T* GetAddr(void) { return p; };
bool isNull(void) { return p==NULL; }
bool notNull(void) { return p!=NULL; }
};
定义引用计数器如下:
class SmartObject {
public:
SmartObject(const char *pName="SmartObject");
virtual ~SmartObject(void);
void AddRef(void);
void Release(void);
int GetRef(void);
private:
const char *m_Name;
int m_Ref;
bool m_Valid;
protected:
};
class A:public SmartObject
{
public:
A():SmartObject("objA"){};
~A(){};
};
typedef SmartObjectPtr PA;
PA pa = new A();//这一句不理解 ---- PA pa 这是用 类型A 来实例化 SmartObjectPtr的一个对象,而new A() 则是分配一个堆内存,并返回对内存的地址。
这2者是怎么扯上关系的?如果从赋值运算符= 来解释,我加上调试信息后,也没有看到输出调用赋值运算啊。
我们一般常用 A *pa1 = new A;
上面PA pa = new A();---这个pa 本来是一个对象,变成了指针??