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

时间:2014-08-15 23:52:54

标签: c++ exception return

例如:

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

3 个答案:

答案 0 :(得分:1)

是的,如果您发现在某些情况下您的功能突然没有返回值,那么:

  • 抛出异常,或
  • 你的设计被打破了

答案 1 :(得分:1)

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

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

答案 2 :(得分:-2)

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

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
}