2013-06-05 38 views
0

我第一次重載下標操作符,並且在返回參考值時遇到麻煩。
我遵循C++常見問題標記的帖子的經驗法則,但有些東西我錯過了。下標操作符重載:返回引用問題

const T& operator[](int index) const { 
    if ((index < 0) || (index > size)) { 
        // provide exception handling for this error 
     std::cout << "Error! Index out of bound." << std::endl; 
     std::exit(0); 
    } else { 
     Block* b = head; 
     while (b) { 
      if (b->position == index) 
       return *b->data; 

      b = b->next; 
     } 
    } 
} 

我實現他們在這兩個變體:與const返回值和const功能(如上所述),和不具有(即除了兩個const關鍵字相同的)。
問題是,當我運行測試主,它只是崩潰。我認爲這個bug是在return *b->data;聲明中的,但我不能確定它可能是什麼,也不是我是否錯誤,還有其他錯誤。
任何想法?
在此先感謝。

+3

首先,'(指數>大小)'應該是'(指數> =大小)'(或更多的 「視覺」'(大小<=指數)'),因爲我猜「索引」的有效範圍是[0,size-1](即'[0,size]')。其次,如果執行永遠不符合條件'(b-> position == index)'並在'b'變爲空時退出循環?函數不會返回任何內容,這是未定義的行爲,您也應該處理該錯誤情況。 –

+0

@gx_你有任何建議來處理沒有返回值的情況嗎?我已經考慮過這個錯誤,但是稍後修復。 – Overflowh

+1

我不知道你的代碼的內部...如果這應該在邏輯上不會發生(即如果對於每個有效的'索引'應該存在一個'塊'中的一個相同的'位置'你的(似乎是一個)我猜你可以在'while'主體之後(或者在函數主體結束之前)發出一個斷言(或者打印一個錯誤並且像上面那樣退出)。在你這樣做之後,再加上我的第一條評論的修復,你的程序還會崩潰嗎?和/或它打印一些錯誤信息? –

回答

1

如果你想返回一個數據引用,我不確定它是否是你想要的,你返回一個T類型的引用,並且我假設數據是T類型的,它應該是這樣的:

return b->data; 

否則,您將返回有關數據地址的參考。

EDIT:糾正一個錯誤

+0

您所說的與鏈接相矛盾。 ' - >'具有比'*'更高的優先權。 – juanchopanza

+0

oww,對不起這是我的錯 – Nic007

+0

如果我從返回中刪除了'*',我從這個'int *''類型的表達式中得到'error:error:'int&'類型的引用無效初始化。 – Overflowh