2012-09-17 30 views
2

我有一個鏈接列表,我保存的數據,以及一個指向下一個節點,Node<T>* next,像這樣:如何讓operator ++進入鏈表中的下一個節點指針?

template <class T> 
struct Node 
{ 
    T data; 
    Node<T>* next; 
}; 

的事情是我想提出這樣的遞增運算符,所以它返回我節點的前一個值,但增加引用。所以,如果我這樣做

Node<int>* someNode = someList.SomeNode(); 
Node<int>* tmp = someNode++; 

tmp將是原來的someNode值,但someNodesomeNode->next

是否可以在結構中放置一個運算符?我試圖去尋找如何去做,但是我沒有和運營商打交道,所以我不知道該怎麼做。

+0

「是否可以在結構中放置一個運算符?」是。記住,在C++中,結構可以具有成員函數,就像一個類。 – drescherjm

+0

結構相當於一個類,但是對於兩件事情來說;默認訪問修飾符是公共的,並且默認情況下繼承也是公共的。其他的完全一樣。 –

+0

謝謝,但我仍然無法做someNode ++;成員Michael Krelin告訴我。原因是someNode是一個指針節點 *沒有節點,如果我嘗試* someNode ++ MVC告訴我我不能轉換 – freesoul

回答

5

您不能將成員函數添加到像指針這樣的基本類型。

你想要定義什麼是一個迭代器。使用包裝類在你的節點指針以成功:

template <class T> 
struct NodeIterator 
{ 
    NodeIterator(Node<T>* current) : current(current) {} 
    NodeIterator& operator ++() { current = current->next; return *this; } 
    NodeIterator operator ++(int) { 
     NodeIterator retVal = *this; 
     ++(*this); 
     return retVal; 
    } 
    T* operator->() const { return &current->data; } 
    T& operator *() const { return current->data; } 
    Node<T>* current; 
}; 

的引用見std::slist<>implementation。看看template<typename _Tp> struct _List_iterator。閱讀STL實現比許多書更好。

用法:

NodeIterator<T> it = &node; 
++it; 
T& t = *it; 
+0

非常感謝! – freesoul

+0

您可以接受答案。我不介意這是否是我的回答;)http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – PiotrNycz

4
Node<T>& operator++(int) {…} 

是您想要實施的成員。

+0

是的,但我在我的代碼中是錯誤的,someNode是一個指針,我剛編輯 – freesoul

+0

我不想這樣做,但它是一個'節點 *運算符++(節點 *&p,int)',I相信。 –

+0

我得到'operator ++'有太多的正式參數 我只是想知道爲什麼我不應該那樣做? – freesoul

0

爲您的代碼工作,你需要能夠定義operator++您的指針類。雖然這不被允許。不過,歡迎您定義一些其他命名函數。例如:

template <typename Node> 
Node goto_next(Node& node) { 
    Node result = node; 
    node = node->next; 
    return result; 
} 

然後你可以使用它像這樣:

Node<int>* tmp = goto_next(someNode); 

另一種選擇是提供一個真正的迭代器類,而不是隻用一個指針:

Node<int>::iterator someNode = someList.begin(); 
Node<int>::iterator tmp = someNode++; 

讓你迭代器保留一個Node<T>*成員,並使++運算符在它返回迭代器對象的副本之前更新該內部指針。

0

你真的不想那樣做。在指針上使用++的想法危險地接近通用迭代器模式。你應該走完整個距離,並創建一個真正的迭代器類。想想std::list<T>::iterator

迭代器是一個非常輕量級的包裝,爲節點指針提供了一個明智的接口,它提供了諸如operator ++移動到下一個節點的東西,並且重載了operator ->以提供對節點數據的簡單訪問。將客戶端代碼從使用指針轉換爲使用迭代器非常簡單,因爲語法幾乎相同。

相關問題