我使用合并排序算法对链表进行排序
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中。
答案 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 =
,它重新分配当前对象持有的值,而不是试图替换当前对象的存在。此外,还有一个移动赋值运算符可以使它快速。