如果不满足条件,我应该在成员函数中返回什么?

What should I return in a member function if a condition is not met?

本文关键字:函数 返回 什么 成员 不满足 如果不 条件 我应该 如果      更新时间:2023-10-16

例如:

class Foo{
   int data;
   // ...
}

有一个成员函数:

Foo func(int a){
  if(a > 10) return Foo(a);
  else {} // problem is here, I do not want return 
             any Foo object, do I throw exception? how?
}

所以,我不想在else块中返回一个新的空Foo对象,我如何以习惯的方式处理这种情况?

如果前置条件对于函数的继续是绝对必要的,那么抛出异常是处理它的正确方法。如果在函数的其余部分不显式地要求条件,那么您有两个选项:

  • 返回管理指针的唯一指针,即std::unique_ptr。我不推荐这种方法,因为它有不必要的动态内存分配。
  • 返回boost::optional<Foo>或以后的TS std::experimental::optional<Foo>。这表达了该值可能存在也可能不存在的意图。
  • 重新评估你的设计。为什么返回取决于条件?我们可以做些什么不同的事情?等。

是的,如果您发现在某些情况下,您的函数应该突然不返回值,那么要么:

  • 抛出异常,或者
  • 你的设计坏了

最好是返回一个指针:

Foo* func(int a){
  if(a > 10) return new Foo(a);
  else return 0; // else return plain zerro
}
c++ 11

Foo* func(int a){
  if(a > 10) return new Foo(a);
  else return nullptr;
}

当然你需要检查返回的对象是否存在于你的调用函数中:

Foo* ptr = func(5);
if(ptr)
{
    // use ptr
    *ptr;
}
else
{
    // do not use it
}
// and delete it
if(ptr) delete ptr;
// in c++11 version no need to check just:
delete ptr;

对不起,我没有看到你不想返回0…

Foo* func(int a){
  if(a > 10) return new Foo(a);
  else throw(a);
}
try
{
    Foo* get = func(4); // this will throw
}
catch(int)
{
     //handle the error here
}