thomas的动力火车 2015-09-14 13:07 采纳率: 33.3%
浏览 1591

c++ 智能对象声明与堆内存,请明白人指点,谢谢

定义 含有计数器的智能类模板如下:
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 本来是一个对象,变成了指针??

  • 写回答

4条回答 默认 最新

  • threenewbee 2015-09-14 13:12
    关注

    typedef SmartObjectPtr PA;
    此时PA不是对象,而是指针了。虽然你没看到星号。

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题