gpt4 book ai didi

c++ - 重载通用句柄类的赋值运算符

转载 作者:行者123 更新时间:2023-11-30 05:10:22 24 4
gpt4 key购买 nike

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

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]
....

最佳答案

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

h = new Base 的隐式转换是这样的:

h = Handle<Base>(new Base);

我用一些打印品更新了你的例子来说明这一点:demo .

关于c++ - 重载通用句柄类的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45707441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com