C ++:返回NULL而不是struct

时间:2010-06-15 23:34:39

标签: c++ error-handling null-object-pattern

我有一个结构Foo。在伪代码中:

def FindFoo:
   foo = results of search
   foundFoo = true if a valid foo has been found  

   return foo if foundFoo else someErrorCode

如何在C ++中实现这一目标?

已编辑以消除许多不准确之处。

8 个答案:

答案 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”元值,表示“未找到”。您可以通过多种方式执行此操作:

  1. throw如果失败,则无条件地返回值
  2. 返回一个指针 - 但这留下了delet荷兰国际集团它在空气中,如果它不是那么回事留在记忆长期的东西的责任
  3. 把它包在处理的条件在同样的方式[模板]包装对象是.NET的Nullable<T>会(我将让别人附和正确的UPDATE:@Mike西摩说,这是{{ 1}})
  4. 使用Null对象模式返回一个适当的值,该值在客户端被视为有效的resut时做正确的事情