2014-04-10 23 views
0

我們正在開發一個自定義List類。我們試圖實現迭代器和const_iterator及其函數,但是我們的++運算符有問題。 PostFix完全不起作用,並且當我們步入太遠時(當前代碼是一個只返回最後有效結果的解決方法),PreFix會給我們分段錯誤。 問題1:如何修復與前綴相關的段錯誤而無需返回上一個有效元素? (我們試過返回nullptr)。Iterator和const_iterator操作符++後置和前綴

即使我們已經按照互聯網上的每個指南<,Postfix也不會迭代。 <

問題2:PostFix爲什麼不起作用?

代碼交&前綴:

List_const_iterator_& operator++() 
    { 
    if(ptr->next_ != nullptr) 
    { 
     ptr = ptr->next_; 
     return *this; 
    } 
    else 
     return *this; 
    } 

    List_const_iterator_ operator++(int unused) 
    { 
    List_const_iterator_ temp(*this); 
    if(ptr->next_ != nullptr) 
    { 
     ptr = ptr->next_; 
     return temp; 
    } 
    else 
     return *this; 
    } 

Testcode(大氣壓下以後綴):

List<int> list1 {324, 2, 3}; 
    List_const_iterator_<int> clst = list1.cbegin(); 
    clst = clst++; 
    cout << "val: " << clst.ptr->data_ << endl; 
    clst = clst++; 
    cout << "val2: " << clst.ptr->data_ << endl; 
clst = clst++; 
    cout << "val3: " << clst.ptr->data_ << endl; 

輸出爲後綴:

val: 324 
val2: 324 
val3: 324 

輸出,用於前綴:

val: 2 
val2: 3 
val3: 3 <-- This is where we segfault if we don't use the controll. 
+0

鑑於postfix操作符返回舊值,您對clst = clst ++;(除了未定義的行爲)有什麼期待? – molbdnilo

回答

2

嘗試用剛:

clst++; 

代替:

clst = clst++; 

後者復位clst其原始值(好象增量沒有發生)。

+0

是的,解決了它! 如果迭代達到我們列表的末尾,您對我們應該做什麼有什麼想法嗎?因爲只是返回最後一個有效值在長期看來似乎不是一個很好的解決方法=) –

+0

@JohanHjalmarsson我認爲你應該像標準庫一樣做,並且讓它不確定(即只是失敗)。迭代應該由調用者通過與「結束」迭代器進行比較來限定。 – molbdnilo

+0

@JohanHjalmarsson:當迭代器到達list1結尾時,它應該與'list1.cend()'進行比較。所以,你可以檢查一下,例如。 'for(it = list1.cbegin(); it!= list1.cend(); ++ it){/ * ... * /}' –