我在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 ?!
}
答案 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_ptr
或smart_ptr
。
顺便说一下。当你想要总是返回一个值时,在C ++中返回Guitar
与在Java中有很大的不同。可能有复制构造函数(或者可能没有 - 依赖),如果你返回Guitar
的子类,你肯定会遇到麻烦......
答案 5 :(得分:1)
如果你正在搜索这样的容器,那么你应该返回一个迭代器,而不是一个对象,让调用者取消引用它。如果找不到吉他,则返回guitars.end()
。
答案 6 :(得分:1)
NULL
实际上只是指向0
空间的指针。因此,返回NULL
与返回0
基本相同,Guitar
不属于{{1}}类型。
如果你让函数返回指向吉他的指针,你可以这样做,但是返回一个指针与返回一个值有很大的不同。
答案 7 :(得分:0)
您有多种选择,具体取决于程序的功能
返回end()迭代器,表示没有找到任何内容
当你搜索一个吉他指针的容器时,你可以返回null
如果没有找到,则返回一个空的Guitar()对象
当然,您必须相应地更改返回类型。