gpt4 book ai didi

c++ - 链表 |重载 + 运算符 | C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:38:39 27 4
gpt4 key购买 nike

我正在训练我的 C++,我正在尝试编写一个能够使用链表表示以下数字的库:

999999999 * ( [i=0]Σ[999999999] 1000000000 ^ i )

例如,如果我的电话号码是 711381450277869054011,它会这样表示:

711 * 1000000000^2 + 381450277 * 1000000000^1 + 869054011> * 1000000000^0

所以,这是我的 LL 的结构及其功能:

typedef struct node* ll;
struct node
{
unsigned int data;
ll next;
};

bool insert(ll&, unsigned int);
// ...
void copy(ll&, ll);
void destroy(ll&);

这是我的无符号超长整数类:

class uli
{
public:
uli();
~uli();

// <<, >>, =, operators...

uli& operator +=(const uli&);
uli& operator +=(char*);
const uli operator +(const uli&);

private:
ll head;
};

uli::uli()
{
head = NULL;

insert(head, 0);
}

uli::~uli()
{
destroy(head);
}

+= 运算符工作正常,我用它来重载 + 运算符。

问题是我不能让方法 operator+() 返回一个 const uli 除非它在我开始使用它之前被解构器销毁。

const uli uli::operator +(const uli& rarg) // rarg: right argument
{
uli larg; // left argument

larg = *this;

larg += rarg;

return larg;
}
// returns an LL to somewhere ???? larg was destroyed.

现在我不能做 Z = X + Y;

最佳答案

您需要关注 Rule of Three ,

If your class needs either

  • a copy constructor,
  • an assignment operator,
  • or a destructor,

then it is likely to need all three of them.

问题的根本原因:
在你的情况下,当你从重载的 operator + 复制返回一个类 uli 实例时,使用编译器生成的隐式复制构造函数,它对你的指针进行浅拷贝,因此是多个指针指向相同的内存地址,当它们中的一个/某些(​​临时对象)被销毁时,指向内存的指针将通过析构函数解除分配,从而使其他指针(悬空)指向不存在的内存/内容。

解决方案:
遵循三法则并实现自己的复制构造函数来执行 Deep Copying 所涉及的指针。

关于c++ - 链表 |重载 + 运算符 | C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9577069/

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