2011-10-23 118 views
1

我試圖創建一個雙向鏈接列表,其中每個列表都有第一個節點,最後一個節點和num_elements。但是,出於某種原因,當我嘗試在UseList.cpp文件中測試代碼時,我無法將num_elements設置爲默認值爲零。不能讓構造函數運行

讓我告訴你我是什麼意思:

在List.h:

template <class L> 
class List 
{ 
    private: 
     Node<L> *first; 
     Node<L> *last; 
     int num_elements; 
    public: 
     // constructors and destructors 
     List(); 
    [...] 
} 

[...] 

template <class L> 
List<L>::List() { 
    first = NULL; 
    last = NULL; 
    num_elements = 0; 
} 

[...] 

這是低下來list.h顯示方法:

template <class L> 
// Print out the data in each node separated by a space. 
void List<L>::show() { 
    cout << num_elements << endl; 
    Node<L> *current_node = first; 
    while (current_node != NULL) { 
     cout << current_node->data << " "; 
     current_node = current_node->next; 
    } 
    cout << endl; 
} 

注意,有是一個cout語句來打印num_elements。

這是UseList.cpp的相關部分:

int main (int argc, char *argv[]) { 
    cout << "-----------------------------------------" << endl; 
    cout << "----------------LIST ONE-----------------" << endl; 
    cout << "-----------------------------------------" << endl; 

    List<int> *list1; 
    srand(time(NULL)); 

    list1->show(); 
[...] 

當節目叫,它打印出「1」,並給了我一個分段錯誤。爲什麼num_elements默認爲「1」而不是「0」?

當我在List<L>::List() {做了清點,沒有打印...(這意味着構造從來沒有運行?)

感謝您的幫助!

回答

3

您正在將指針聲明爲List<int>,而不是將其初始化爲任何內容。

2

您已創建一個指向List<int>對象的指針,但沒有對象。所以,目前,由於指針是「懸掛」的,你的程序將會出現分段錯誤。當您嘗試使用->取消引用時,您正在訪問不屬於您的內存,並且失敗。爲了解決這個問題,只需分配一個新的列表對象:

List<int> *list1 = new List<int>(); 

不要忘記稍後釋放它:

delete list1; 

你的另一種選擇是隻是沒有使用動態內存。如果你不需要,你不應該使用它。

List<int> list1; 

list1.show() 
+0

實例這是完美的。謝謝!一旦StackOverflow說10分鐘結束,我會接受答案。 –

0
List<int> *list1; 

聲明list1是一個指針。

List<int> *list1 = new List<int>(); 

實際上創造的List