从返回一个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 ?!
}
Java引用与C++指针类似。因此,如果您要返回对现有吉他实例的引用或null,那么使您的函数返回一个吉他*可能是您想要的。
相比之下,你的代码实际上是在返回一个新的吉他,它是现有实例的副本。
通过比较返回吉他&还会返回对现有吉他实例的引用,但不允许您返回null。
很明显,当返回一个吉他*时,调用者应该知道它是合约的一部分,这是一个现有的实例。有时候你想写一个函数来在堆栈上分配一个新的实例。有时您需要一些高级参考计数或垃圾收集系统。
哦,是的,我应该返回一个指向吉他啊,我让自己由java代码上当:)我是有点混乱,因为我从来没有在这之前遇到过,对无法返回0返回对象的时候,我didint意识到它不是返回一个指向对象的指针。由于 – Kobe 2011-03-19 23:34:21
在java中,你可以“返回null”,因为对象是通过引用传递的。但在你的例子中,你的函数按值返回一个对象。就是这样,你必须返回类型为“吉他”的东西,而NULL不是吉他类型。
而不是用Java的方式,你应该这样做的C + +的方式是抛出一个例外,如果你没有找到任何项目。但顺便说一下,这取决于你正在寻找的物品是否可能丢失。
在C++对象中更像是一个结构或值。返回int
时不能返回null,对吗? 为了能够返回NULL
(或等效),你的函数应该返回一个指针Guitar*
,auto_ptr
或smart_ptr
。
Btw。当你想要总是返回一个值时,在C++中返回Guitar
与在Java中有很大不同。可能涉及拷贝构造函数(或者可能没有 - 依赖),并且如果返回Guitar
的子类,那么肯定会遇到麻烦......
如果你正在通过这样的容器进行搜索,那么你应该返回一个迭代器,而不是一个对象,并让调用者解引用它。如果没有找到吉他,则返回guitars.end()
。
是也许它可能是更好的,但是这第一个设计是肯定不对的,因为旁边的书,它会告诉我错误的认为在实际的代码,并加以改正,也许您的解决方案将是在这本书:) – Kobe 2011-03-19 23:37:18
NULL
实际上只是指向0
处的空间。因此返回NULL
基本上与返回0
相同,其不是Guitar
类型。
如果你让你的函数返回一个指向吉他的指针,但是返回一个指针与返回一个值有很大不同,你可以这样做。
您有几种选择,这取决于程序做什么
符结束()迭代器,信号是什么也没有找到
为您搜索吉他的指针,你能返回NULL
的容器如果没有找到
当然 返回一个空的吉他()对象,你就必须相应地改变返回值类型。
,除非你回到一个吉他* – 2011-03-19 23:26:54
即使更改返回类型为'吉他*','回报,你都不能返回null **它;'不实际返回类型Guitar'的'的对象。你正在尝试混合这两个不正确的。 – Mahesh 2011-03-19 23:51:04
值得一提的是,如果你返回一个迭代,你得到的是几乎相同的'的std :: find'。 – 2011-03-19 23:55:11