2015-11-18 27 views
2

=我有這樣的一個結構 -請幫助我瞭解運算符重載鏈表C++

struct IntNode 
{ 
    int data;     
    IntNode * next;   
}; 

,並在類 -

class NodeSLList { 
    private:`` 
     IntNode *head, *tail; 
//some other functions 
    } 

我有一個對象list1其中包含鏈表節點很少。我必須從list1創建另一個鏈表list2。 如何實現這一目標使用功能 -

NodeSLList & operator=(NodeSLList &list){} 

我不能如何已瞭解訪問list2內部操作者=功能,我將通過list1裏面喜歡 -

list2=list1; 

我如何訪問list2 ??

+0

與this指針的幫助 – NightFurry

回答

1

記住this指針指向退出你的,這樣操作類,this->head或者乾脆head是舊列表的成員這是你想要改變的,newList.head是新名單的成員,你必須分配。

NodeSLList & operator=(NodeSLList &newList) 
{ 
     //Check if there is something to free? 
     if(head != NULL) //this->head != NULL 
     {      
       //free head 
     } 
     //Assign new one 
     head = newList.head; //this->head = newList.head; 
     //Other stuff if any 
     return this; 
} 
+0

'//this.head = list.head ;''this'是一個指針,所以使用' - >'運算符代替。 –

+0

謝謝@ AimanAl-Eryani,我更新了我的答案。 –

+0

所以這 - >頭和頭都是一樣的?意味着兩者都指的是list2? –

1

this會是一個指向左操作數的指針,在你的情況下是list2。要獲得list2本身,只需使用解引用運算符*對其進行解引用。即*this

1

答案是*this

無論如何。請不要實施您自己的鏈接列表。已有std::list,或者如果您需要雙向鏈接列表std::deque。您需要付出很多努力才能使您的代碼與標準庫一樣高質量,更不用說定義一個接口了,這同樣經過深思熟慮。

所以,如果這是四所你的學校,寫你自己的鏈表。我們都做到了。這是用指針練習編程的好方法。但請耐心等待稍後在產品代碼中做這種事情的誘惑。我經常看到它,大部分時間都很慢並且效率低下,而且通常也很麻煩。

0

函數(運算符)NodeSLList & operator=(NodeSLList &list)被稱爲copy assignment operator。它不會創建新對象,而是分配給它們。所以對於你的第一個問題

我不得不從list1創建另一個鏈表list2。我如何 使用該功能實現此目的...

答案是;你沒有。首先你創建一個新對象list2,然後你可以分配給它。下面的代碼將首先調用默認的構造函數,然後拷貝賦值運算符:

NodeSLList list2; 
list2 = list1; 

所以實際上list2 = list1;

list2.operator=(list1); 

也許,這使得它更明顯,功能operator=用於在速記一個現有的對象,以及所有其他答案已經指出,您可以通過*this訪問此對象。

順便說一句,如果你寫NodeSLList list2 = list1;,你會調用copy constructor,這是一個其他的故事......