【发布时间】:2012-10-26 14:13:37
【问题描述】:
我有一个以对象类型作为返回值类型的成员函数:
MyObject myfunction(parameters) {
if (some condition) {
return MyObject(parameters);
} else {
... no valid object can be created ...
}
}
在某些条件下(在函数体中检查)无法创建和返回 MyObject 类型的对象。
作为一个偶尔的 c++ 程序员,我可以自发地想出三个解决方案:
- 将返回值类型更改为 * MyObject 并在无法创建有效对象时返回 nullptr (C++11),然后在调用代码中检查与 nullptr 是否相等。
- 如果无法创建对象并在调用代码中捕获该对象,则引发异常。
- 使用我定义为无效的一些值创建一个对象,并在使用返回的对象之前检查这些值。
处理这种情况的标准方法和性能方面的最佳解决方案是什么? ...或者一些我看不到的明显解决方法...
最先进的 C++11 解决方案将是完美的 :-)
到目前为止我的想法:
解决方案 1 看起来不错,但仅适用于 C++11,我必须在堆上创建返回的对象才能将其传递给主程序(将对象本身返回给调用函数,从而将其保留在对于小物体,堆栈可能更快?)。
解决方案 2 可能会更慢,并导致主程序中的编码冗长。
解决方案 3 可能是最慢的(徒劳地创建了一个对象),并且在主程序中检查不是很方便。
对于我的代码,没有有效的返回对象是默认情况而不是异常,并且创建的对象相当小,但考虑不同情况的一般考虑对于其他读者的应用程序肯定有用...
非常感谢大家的帮助:-)
【问题讨论】:
-
我不知道
myfunction是做什么的,我也不知道MyObject是什么。我怎样才能给你一个最好的解决方案? -
通常我会说 nullptr,但这真的取决于你的项目。
-
如果你真的需要返回实例而不是这个函数中的指针抛出异常将是正确的方法恕我直言
-
myFunction 的用途是什么?它是否存在只是为了让您可以在失败的情况下做一些不同的事情?上述所有三个选项的替代方案可能是在某些情况下简单地在 MyObject 的构造函数中抛出异常。
-
@datamole 问题在于这两个目标是矛盾的,至少从某人回答的角度来看:尽可能简单是一个非常具体的例子;尽可能笼统地不会要求最佳解决方案,而是要求做出决定的主要驱动动机是什么。事实上,这不是一个简单的问题(需要考虑的相关变量太多),也不是一个普遍的问题(它要求一个最佳解决方案,因此它不可能适用于许多情况)
标签: c++ function pointers null