繁体   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