10

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

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

   return foo if foundFoo else someErrorCode

如何在 C++ 中完成此任务?

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

4

8 回答 8

15

C++ 对象永远不能为 null 或为空。指针可以保存一个空指针值,表明它们没有指向任何东西。

典型的解决方案是抛出异常。否则,使用指针;只要确保您没有返回临时地址。

我不建议尝试用其他语言的知识自学 C++,你会伤害自己。抓住一本好的入门级书籍,这是最好的学习方式。

于 2010-06-15T23:40:40.977 回答
3

抛出异常。这就是他们的目的。

于 2010-06-15T23:45:35.130 回答
3

您可以查看boost::optional它是否符合您的需求。然而:

如果 foundFoo 则返回 foo否则 someErrorCode

这让我觉得如果你没有找到 foo.js,最好还是抛出异常。

于 2010-06-15T23:53:55.373 回答
1

一种方法是返回一个指向 foo 的指针:

public Foo* findFoo()
{
    return fooFound ? new fooResult() : NULL;
}

定义某种类型的另一种可能性NullFoo,可能是具有空实现的struct扩展。Foo有关后一种想法的更多信息,您可以阅读Null Object Pattern

编辑:修改后的问题有些不同,正如其他人所提到的,您最好抛出异常而不是执行上述任何一项。

于 2010-06-15T23:36:55.430 回答
0

这在 C# 中也不起作用。您应该返回一个指向 Foo 的指针。

于 2010-06-15T23:35:16.450 回答
0

如果不求助于标准库之外的指针或库解决方案,在 C++ 中是不可能的。(Boost 不是标准库的一部分,它是第 3 方解决方案。)

在 C# 中,您可以使用Nullable<Foo>.

与比利的评论相反,结构是值类型,而不是引用类型,并且 Nullable 可以应用于任何值类型,而不仅仅是内置。以下编译得很好:

struct Test {
    int Blah;
}
void Main() {
    System.Nullable<Test> proof;
}
于 2010-06-15T23:41:21.223 回答
0

找到一个 foo 真的不是一种特殊情况吗?然后抛出异常。期望找不到 foo?让函数返回错误代码并通过引用参数将 foo 传递出去,其中 foo 仅在函数没有返回错误时才有效。

于 2010-06-16T15:12:53.417 回答
-1

您也不能在 C# 中执行此操作 - 您需要 return new Foo(),而不是null让编译器满意。

同上 C++ 案例 - 如果要按值返回,则需要实例化一个结构。如果不是,您希望通过指针返回(在这种情况下,您将使用new或返回指向以另一种方式分配的指针的指针,这会将混乱的所有权转移语义带入等式)。

编辑:根据您的更新。您似乎想要返回一个值或一个表示“未找到”的“空”元值。您可以通过多种方式执行此操作:

  1. throw如果失败,否则无条件返回一个值
  2. delet返回一个指针 - 但是如果它不是长期留在内存中的东西,这就留下了将它悬空的责任
  3. 将其包装在一个 [模板化] 包装器对象中,该包装器对象以与 .NET 相同的方式处理条件Nullable<T>(我会让某人加入正确的更新:@Mike Seymour 说它是boost::optional<foo>
  4. 使用 Null Object 模式返回一个适当的值,该值在客户端被视为有效结果时执行正确的操作
于 2010-06-15T23:36:20.080 回答