【问题标题】:What should I return in a member function if a condition is not met?如果不满足条件,我应该在成员函数中返回什么?
【发布时间】:2014-10-09 17:40:57
【问题描述】:

例如:

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 对象,我该如何以惯用的方式处理这种情况?

【问题讨论】:

  • 抛出异常?有什么问题?
  • 你是怎么调用这个函数的?如果 a 小于 10,调用者期望什么?
  • 在这种情况下,我还考虑返回一个指向新 Foo 对象的指针,如果 a > 10 为假,则返回 nullptr。尽管异常可能会强化这样一个事实,即您认为您的函数不应该支持这种情况。
  • Stephane 是对的,指针工作得很好,但我确实想返回对象,如果 a 调用者什么也不期望

标签: c++ exception return


【解决方案1】:

如果函数继续运行绝对需要前置条件,那么抛出异常是处理它的正确方法。如果在函数的其余部分中没有明确要求条件,那么您有几个选择:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      最好的办法是返回一个指针:

      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
      }
      

      【讨论】:

      • 这是一个钝器。我认为您没有考虑(或意识到)这引发的设计问题的微妙之处。请阅读 Rapptz 的答案以找出答案。
      猜你喜欢
      • 2018-09-07
      • 2021-04-22
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      相关资源
      最近更新 更多