2014-07-16 82 views
0

是否有可能重載一個運算符返回一個字符串而不是類類型?重載操作符返回類型

string operator++() { 
    index++; 
    if (index > num_atts) { 
     index = 0; 
    } 

    string ret = att_names[index]; 
    return ret; 

} 
+3

您有[未定義的行爲](http://stackoverflow.com/questions/6441218/can-a-local-variables-memory-be-accessed-outside-its-scope)。返回一個'std :: string'。 – chris

+0

您可以返回任何你喜歡的類型。但是,您的上述代碼表現出未定義的行爲。 –

+0

爲什麼你認爲這是不可能的?你可以回報你想要的任何東西。還有heed @ chris的評論 – EdChum

回答

0

您可以返回任何您喜歡的類型,就像您編寫的任何其他函數一樣。但是就像任何其他函數一樣,你不能返回一個指向即將超出範圍的本地堆棧變量的指針,這是未定義的行爲。要解決這個問題,最簡單的事情就是簡單地返回string,是這樣的:

std::string operator++() { 
    // ... 
    return ret; 
} 
+0

謝謝,糾正之後我發佈了這個問題:) – manatttta

1

該代碼對語法沒有錯誤。但是,它在語義上有至關重要的錯誤。

const char *operator++() { 
    index++; 
    if (index > num_atts) { 
     index = 0; 
    } 

    string ret = att_names[index]; // 1 
    return ret.c_str();   // 2 & 3 
}         // 4 
  1. ret對象被創建
  2. 你叫ret.c_str()ret對象爲您製作C字符串,並將其返回。
  3. 現在,您正試圖返回c字符串。
  4. 但是在這個時候,ret被銷燬,並且它也銷燬c字符串,因爲該c字符串的所有者是ret
  5. 因此,現在你正在返回指針破壞
+2

準確地說,「指向被破壞的對象」。 – Greg