更改方法内的对象

时间:2013-08-22 16:48:33

标签: c++ algorithm mergesort singly-linked-list

我使用合并排序算法对链表进行排序

void node::merge_sort()
{
    if (head == NULL || head->next == NULL)
    {
        return;
    }
    node *p = new node;
    node *q = new node;
    this->divide(&p, &q);
    p->merge_sort();
    q->merge_sort();
    this=merge_lists(p, q);
}

但我必须更改此方法中的对象,因为我键入了this=merge_lists(p,q)。但这是一个错误说nolvalue。还有其他办法吗?

除法函数用于将列表分为两部分,并将它们存储在p和q中。

1 个答案:

答案 0 :(得分:1)

不,你不能重新分配this。比喻就是如果我走到你面前说“你现在就是那个身体”。你的回答是“甚至没有意义”。你是对的。你想要做的是改变当前对象的状态,而不是完全替换它。

此外,没有理由在此处分配动态对象。不要那样做。这会使您的代码变慢并且更容易出错。实际上,您的界面似乎根本不需要指针

void node::merge_sort()
{
    if (head == NULL || head->next == NULL)
    {
        return;
    }
    node left, right;
    divide(left, right);
    left.merge_sort();
    right.merge_sort();
    *this = merge_lists(left, right); //this line is the key to answering to your question
}

然后从以下位置更改您的功能签名:

void node::divide(node** left, node** right);
node merge_lists(node* left, node* right);
node& node::operator=(const node& right_hand_side);

void node::divide(node& left, node& right);
node merge_lists(node& left, node* right);
node& node::operator=(const node& right_hand_side);
node& node::operator=(node&& right_hand_side); //along with this line

这里的键是*this =,它重新分配当前对象持有的值,而不是试图替换当前对象的存在。此外,还有一个移动赋值运算符可以使它快速。