链接列表| 重载+运算符| C++

Jon*_*nas 4 c++ overloading linked-list operator-keyword

我正在训练我的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&);
Run Code Online (Sandbox Code Playgroud)

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

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);
}
Run Code Online (Sandbox Code Playgroud)

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

问题是我不能让方法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.
Run Code Online (Sandbox Code Playgroud)

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

Alo*_*ave 6

你需要遵循三法则,

如果你的班级需要

  • 复制构造函数,
  • 赋值运算符,
  • 或者是一个析构函数,

然后它可能需要所有这三个.

问题的根本原因:
在您的情况下当您uli通过重载从复制返回类实例时,operator +使用编译器生成的隐式复制构造函数并且它使指针的浅表副本,因此多个指针指向相同的内存地址,当一个/其中一些(临时对象)被破坏,指向内存的内存通过析构函数释放,并留下其他指针(悬空)指向不存在的内存/内容.

解决方案:
遵循Rule of Three并实现您自己的复制构造函数以执行所涉及指针的深度复制.