从返回C ++对象的函数返回null

时间:2011-03-19 23:23:33

标签: c++

我在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 ?!
}

8 个答案:

答案 0 :(得分:3)

Java引用就像C ++指针。因此,如果您要返回对现有Guitar实例的引用或null,那么让您的函数返回Guitar *可能就是您想要的。

相比之下,您的代码实际上正在做的是返回一个新的Guitar,它是现有实例的副本。

通过比较返回吉他&amp;还会返回对现有Guitar实例的引用,但不允许返回null。

显然,当返回吉他*时,调用者应该知道这是合同的一部分,这是现有的实例。有时您想编写一个在堆栈上分配新实例的函数。有时您需要一些高级引用计数或垃圾收集系统。

答案 1 :(得分:3)

您应该返回Guitar*。如果guitars数组的生命周期长于您需要的返回引用,则此方法有效。

答案 2 :(得分:1)

在java中,您可以“返回null”,因为对象是通过引用传递的。但在您的示例中,您的函数按值返回一个对象。就是这样,你必须返回类型为“Guitar”的东西,而NULL不是吉他类型。

答案 3 :(得分:1)

不是采用Java方式,而应该采用C ++方式,在没有找到任何项目的情况下抛出异常。但顺便说一下,这取决于你要找的物品是否可以丢失。

答案 4 :(得分:1)

在C ++中,对象更像是结构或值。返回int时无法返回null,对吗? 为了能够返回NULL(或等效),您的函数应返回指针Guitar*auto_ptrsmart_ptr

顺便说一下。当你想要总是返回一个值时,在C ++中返回Guitar与在Java中有很大的不同。可能有复制构造函数(或者可能没有 - 依赖),如果你返回Guitar的子类,你肯定会遇到麻烦......

答案 5 :(得分:1)

如果你正在搜索这样的容器,那么你应该返回一个迭代器,而不是一个对象,让调用者取消引用它。如果找不到吉他,则返回guitars.end()

答案 6 :(得分:1)

NULL实际上只是指向0空间的指针。因此,返回NULL与返回0基本相同,Guitar不属于{{1}}类型。

如果你让函数返回指向吉他的指针,你可以这样做,但是返回一个指针与返回一个值有很大的不同。

答案 7 :(得分:0)

您有多种选择,具体取决于程序的功能

返回end()迭代器,表示没有找到任何内容 当你搜索一个吉他指针的容器时,你可以返回null
如果没有找到,则返回一个空的Guitar()对象

当然,您必须相应地更改返回类型。