2013-08-22 42 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 =,它重新分配當前對象所持有的值,而不是嘗試替換當前對象的存在。此外,移動賦值運算符使其更快。