重载泛型句柄类的赋值运算符

时间:2017-08-16 07:24:37

标签: c++ oop templates

我有以下代码(来自Koening& Moo Accelerated C ++ 第255页),它定义了一个通用句柄类HandleHandle用于管理对象的内存。但是,我不太关注代码的一个方面。

template <class T>
class Handle
{
  public:
    Handle() : p(0) {}
    Handle &operator=(const Handle &);
    ~Handle() { delete p; }

    Handle(T *t) : p(t) {}

  private:
    T *p;
};

template <class T>
Handle<T> &Handle<T>::operator=(const Handle &rhs)
{
    if (&rhs != this)
    {
        delete p;
        p = rhs.p ? rhs.p->clone() : 0;
    }
    return *this;
};

class Base
{
    friend class Handle<Base>;

  protected:
    virtual Base *clone() const { return new Base; }

  private:
    int a;
};

main()
{
    Handle<Base> h;
    h = new Base;

    return 0;
}

当我们重载=时,为什么rhs const Handle类型的参数Handle<T> &Handle<T>::operator=(const Handle &rhs)main中的分配中的右侧是Base*类型为h = new Base(const T &rhs))?参数不应该h来容纳我们分配给const Handle &rhs的类型吗?

如果我将const T &rhs替换为*** Error in `./main': double free or corruption (fasttop): 0x000055aca1402c20 *** ======= Backtrace: ========= /lib/x86_64-linux-gnu/libc.so.6(+0x790cb)[0x7f16c54020cb] .... ,那么程序会编译 - 但我会从

开始列出一长串错误
protected $fillable = ['name', ....];

1 个答案:

答案 0 :(得分:1)

new Base通过Handle构造函数隐式转换为Handle(T *t),然后分配给h

来自h = new Base的隐式转换的工作原理如下:

h = Handle<Base>(new Base);

我用一些打印件更新了您的示例以说明这一点:demo