2014-05-24 39 views
0

我一直在更新舊的模板鏈表,以便能夠採取複雜的數據類型。但我不知道如何使它能夠返回節點類中的數據元素。目前我的節點類的代碼看起來是這樣的:C++模板鏈表獲取複雜數據類型的數據元素

using namespace std; 

#ifndef Node_A 
#define Node_A 

template <class T> 
class Node 
{ 
public: 
    Node(); 
    ~Node(); 
    T getData(); 
    Node* getNext(); 
    void setData(T); 
    void setNext(Node*); 

private: 
    Node *next; 
    T data; 
}; 

template <class T> 
Node<T>::Node() 
{ 
    next = NULL; 
    return; 
} 

template <class T> 
Node<T>::~Node() 
{ 
    return; 
} 

template <class T> 
T Node<T>::getData() 
{ 
    return data; 
} 

template <class T> 
Node<T>* Node<T>::getNext() 
{ 
    return next; 
} 

template <class T> 
void Node<T>::setData(T a) 
{ 
    data = a; 
    return; 
} 

template <class T> 
void Node<T>::setNext(Node* a) 
{ 
    next = a; 
    return; 
} 

#endif 

現在,如果數據類型T是一種原始的這個工作完全正常,但如果你使用一個非原始好比說一個結構,將給予一個運行時錯誤。我認爲,因爲結構不爲=運算符做運算符重載。有沒有一種簡單的方法來解決這個問題,而不需要徹底檢修課堂?

+0

你想通過值複製元素,還是隻想指向鏈表中的元素? – merlin2011

+0

好點。最終,列表類必須實現某種搜索,它將使用getData將列表類中的數據與從節點類檢索到的元素進行比較。我希望鏈表的所有處理都在列表或節點類的main之外完成。但是要操縱一個結構體,我需要一些關於它的結構的信息,在主體創建它的一個實例之前我不知道它的結構。除非我錯過了一些更高層次的編碼策略。 – user3390349

+0

這個:'Node :: Node()'不應該是一個選項。如果你正在做的是默認構造數據,那麼在構建包含模板數據的節點時有什麼意義?這個節點模板在你的鏈表中的使用*應該是相當透露你需要什麼以及你不需要什麼。關於賦值運算符,除非類型T或其成員之一特別*不可賦值,否則這應該起作用。但是,您可能希望採用移動語義來減少所有不必要的複製。無論如何,發佈代碼**如何重現問題**。 – WhozCraig

回答

0

這不是重載=運算符,而是關於爲結構實現賦值運算符。如果你這樣做,你將不需要改變你的課程,除非我錯過了其他的東西。

上面假設您將在節點內部複製數據。或者,您可以通過引用傳遞數據。在這種情況下,您需要小心在刪除Node對象之前數據不會被刪除,否則在嘗試訪問Node中的已刪除數據對象時會發生崩潰。