2013-08-22 40 views
0

内的对象我使用的是合并排序算法进行排序链表更改方法

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

这里的指针真的有必要吗?即使他们是,'新'不是。 – chris

+0

指定'this'不起作用!将你的'merge_sort()'函数设计为静态类成员或'node'类之外。 –

+0

@chris是的,他们需要存储的两半的地址,并改变他们在分功能 – zed111

回答

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 =,它重新分配当前对象所持有的值,而不是尝试替换当前对象的存在。此外,移动赋值运算符使其更快。