从返回一个C++对象的函数中返回null

问题描述:

我正在做一个头部首先面向对象的分析和设计的例子,但我用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

Java引用与C++指针类似。因此,如果您要返回对现有吉他实例的引用或null,那么使您的函数返回一个吉他*可能是您想要的。

相比之下,你的代码实际上是在返回一个新的吉他,它是现有实例的副本。

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

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

+0

哦,是的,我应该返回一个指向吉他啊,我让自己由java代码上当:)我是有点混乱,因为我从来没有在这之前遇到过,对无法返回0返回对象的时候,我didint意识到它不是返回一个指向对象的指针。由于 – Kobe 2011-03-19 23:34:21

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

而不是用Java的方式,你应该这样做的C + +的方式是抛出一个例外,如果你没有找到任何项目。但顺便说一下,这取决于你正在寻找的物品是否可能丢失。

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

Btw。当你想要总是返回一个值时,在C++中返回Guitar与在Java中有很大不同。可能涉及拷贝构造函数(或者可能没有 - 依赖),并且如果返回Guitar的子类,那么肯定会遇到麻烦......

您应该改为返回Guitar*。如果guitars数组的生存时间比您需要返回的参考时间更长,则此功能可用。

+0

是的,我怎么能错过。谢谢。 – Kobe 2011-03-19 23:34:52

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

+0

是也许它可能是更好的,但是这第一个设计是肯定不对的,因为旁边的书,它会告诉我错误的认为在实际的代码,并加以改正,也许您的解决方案将是在这本书:) – Kobe 2011-03-19 23:37:18

NULL实际上只是指向0处的空间。因此返回NULL基本上与返回0相同,其不是Guitar类型。

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

您有几种选择,这取决于程序做什么

符结束()迭代器,信号是什么也没有找到
为您搜索吉他的指针,你返回NULL
的容器如果没有找到

当然 返回一个空的吉他()对象,你就必须相应地改变返回值类型。