2011-03-19 141 views
3

我正在做一個頭部首先面向對象的分析和設計的例子,但我用C++編寫,我不知道如何編寫「return null」來自java。從返回一個C++對象的函數中返回null

Guitar getGuitar(string serialNumber) 
{ 
    for (vector<Guitar*>::iterator it = guitars.begin(); it != guitars.end(); ++it) 
    { 
     if ((*it)->getSerialNumber() == serialNumber) 
     { 
      return **it; 
     } 
    } 
    //return null (java); What should return here ?! 
} 
+2

,除非你回到一個吉他* – 2011-03-19 23:26:54

+0

即使更改返回類型爲'吉他*','回報,你都不能返回null **它;'不實際返回類型Guitar'的'的對象。你正在嘗試混合這兩個不正確的。 – Mahesh 2011-03-19 23:51:04

+1

值得一提的是,如果你返回一個迭代,你得到的是幾乎相同的'的std :: find'。 – 2011-03-19 23:55:11

回答

3

Java引用與C++指針類似。因此,如果您要返回對現有吉他實例的引用或null,那麼使您的函數返回一個吉他*可能是您想要的。

相比之下,你的代碼實際上是在返回一個新的吉他,它是現有實例的副本。

通過比較返回吉他&還會返回對現有吉他實例的引用,但不允許您返回null。

很明顯,當返回一個吉他*時,調用者應該知道它是合約的一部分,這是一個現有的實例。有時候你想寫一個函數來在堆棧上分配一個新的實例。有時您需要一些高級參考計數或垃圾收集系統。

+0

哦,是的,我應該返回一個指向吉他啊,我讓自己由java代碼上當:)我是有點混亂,因爲我從來沒有在這之前遇到過,對無法返回0返回對象的時候,我didint意識到它不是返回一個指向對象的指針。由於 – Kobe 2011-03-19 23:34:21

1

在java中,你可以「返回null」,因爲對象是通過引用傳遞的。但在你的例子中,你的函數按值返回一個對象。就是這樣,你必須返回類型爲「吉他」的東西,而NULL不是吉他類型。

1

而不是用Java的方式,你應該這樣做的C + +的方式是拋出一個例外,如果你沒有找到任何項目。但順便說一下,這取決於你正在尋找的物品是否可能丟失。

1

在C++對象中更像是一個結構或值。返回int時不能返回null,對嗎? 爲了能夠返回NULL(或等效),你的函數應該返回一個指針Guitar*,auto_ptrsmart_ptr

Btw。當你想要總是返回一個值時,在C++中返回Guitar與在Java中有很大不同。可能涉及拷貝構造函數(或者可能沒有 - 依賴),並且如果返回Guitar的子類,那麼肯定會遇到麻煩......

3

您應該改爲返回Guitar*。如果guitars數組的生存時間比您需要返回的參考時間更長,則此功能可用。

+0

是的,我怎麼能錯過。謝謝。 – Kobe 2011-03-19 23:34:52

1

如果你正在通過這樣的容器進行搜索,那麼你應該返回一個迭代器,而不是一個對象,並讓調用者解引用它。如果沒有找到吉他,則返回guitars.end()

+0

是也許它可能是更好的,但是這第一個設計是肯定不對的,因爲旁邊的書,它會告訴我錯誤的認爲在實際的代碼,並加以改正,也許您的解決方案將是在這本書:) – Kobe 2011-03-19 23:37:18

1

NULL實際上只是指向0處的空間。因此返回NULL基本上與返回0相同,其不是Guitar類型。

如果你讓你的函數返回一個指向吉他的指針,但是返回一個指針與返回一個值有很大不同,你可以這樣做。

0

您有幾種選擇,這取決於程序做什麼

符結束()迭代器,信號是什麼也沒有找到
爲您搜索吉他的指針,你返回NULL
的容器如果沒有找到

當然 返回一個空的吉他()對象,你就必須相應地改變返回值類型。