簡體   English   中英

從返回C ++對象的函數返回null

[英]Returning null from function which returns a C++ object

我在Head First面向對象分析和設計方面做了一個例子,但是我用C ++編寫代碼,我不知道如何從java編寫等效的“return 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 ?!
}

Java引用就像C ++指針。 因此,如果您要返回對現有Guitar實例的引用或null,那么使您的函數返回Guitar *可能就是您想要的。

相比之下,您的代碼實際上正在做的是返回一個新的Guitar,它是現有實例的副本。

相比之下,返回一個Guitar並且還會返回對現有Guitar實例的引用,但不允許返回null。

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

你應該返回Guitar* 如果guitars陣列的壽命比您需要的返回引用長,則此方法有效。

在java中,您可以“返回null”,因為對象是通過引用傳遞的。 但在您的示例中,您的函數按值返回一個對象。 就是這樣,你必須返回類型為“Guitar”的東西,而NULL不是Guitar類型。

而不是以Java方式進行,你應該采用C ++方式,在沒有找到任何項目的情況下拋出異常。 但順便說一下,這取決於你要找的物品是否可以丟失。

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

順便說一句。 當你想要總是返回一個值時,在C ++中返回Guitar就像在Java中一樣。 可能有復制構造函數(或者可能沒有 - 依賴),如果你返回一個Guitar的子類,你肯定會遇到麻煩......

如果你正在搜索這樣的容器,那么你應該返回一個迭代器,而不是一個對象,讓調用者取消引用它。 如果找不到吉他,則返回guitars.end()

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

如果使函數返回指向吉他的指針,則可以執行此操作,但返回指針與返回值有很大不同。

您有多種選擇,具體取決於程序的功能

返回end()迭代器,表示沒有找到任何內容
當你搜索一個吉他指針的容器時,你可以返回null
如果沒有找到,則返回一個空的Guitar()對象

當然,您必須相應地更改返回類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM