我有一个结构Foo
。在伪代码中:
def FindFoo:
foo = results of search
foundFoo = true if a valid foo has been found
return foo if foundFoo else someErrorCode
如何在C ++中实现这一目标?
已编辑以消除许多不准确之处。
答案 0 :(得分:13)
C ++对象永远不能为null或为空。指针可以保存空指针值,表示它们指向任何位置。
典型的解决方案是抛出异常。否则,使用指针;只是确保你没有返回临时地址。
我不建议尝试用其他语言的知识教自己C ++,你会伤到自己。抓住good beginner-level book,这是最好的学习方式。
答案 1 :(得分:4)
抛出异常。这就是他们的目的。
答案 2 :(得分:3)
您可以查看boost::optional
,看看它是否符合您的需求。但是:
如果foundFoo 返回foo> else someErrorCode
这让我觉得如果你找不到foo,最好不要抛出异常。
答案 3 :(得分:1)
这在C#中也不起作用。你应该返回一个指向Foo的指针。
答案 4 :(得分:1)
这样做的一种方法是返回指向foo的指针:
public Foo* findFoo()
{
return fooFound ? new fooResult() : NULL;
}
定义某种NullFoo
的另一种可能性,可能是struct
扩展Foo
,其实现为空。有关后一种想法的更多信息,您可以阅读Null Object Pattern。
编辑:修改后的问题有些不同,正如其他人提到的那样,你可能最好抛出一个例外,而不是做上述任何一个。
答案 5 :(得分:1)
如果没有在标准库之外使用指针或库解决方案,那么在C ++中是不可能的。 (Boost不是标准库的一部分,它是第三方解决方案。)
在C#中,您可以使用Nullable<Foo>
。
与Billy的评论相反,结构是值类型,而不是引用类型,Nullable可以应用于 任何 值类型,而不仅仅是内置函数。以下编译就好了:
struct Test {
int Blah;
}
void Main() {
System.Nullable<Test> proof;
}
答案 6 :(得分:1)
找不到foo真的是特殊情况吗?然后抛出异常。期待找不到foo?让函数返回一个错误代码并通过引用参数传递foo,其中foo仅在函数没有返回错误时才有效。
答案 7 :(得分:0)
您无法在C#中执行此操作 - 您需要返回new Foo()
,而不是null
以使编译器满意。
与C ++案例相同 - 如果要按值返回,则需要实例化结构。如果不是,要通过指针返回(在这种情况下,你是new
荷兰国际集团或返回一个指针到一个以另一种方式,这带来混乱所有权转移语义入方程分配)。
编辑:根据您的更新。您似乎想要返回值或“null”元值,表示“未找到”。您可以通过多种方式执行此操作:
throw
如果失败,则无条件地返回值delet
荷兰国际集团它在空气中,如果它不是那么回事留在记忆长期的东西的责任Nullable<T>
会(我将让别人附和正确的UPDATE:@Mike西摩说,这是{{ 1}})