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