【问题标题】:How can I handle returning an error from a getter method?如何处理从 getter 方法返回的错误?
【发布时间】:2021-04-03 13:30:23
【问题描述】:

我想知道在这种情况下如何从 getter 方法返回错误?

class A 
{
private:
  int a;
  int b;
public:
  const int& get(int i) 
  {
    if (i == 1) return a;
    else if (i == 2) return b;
    // else... what to do here? I get a warning if I don't put anything.
  }
};

【问题讨论】:

  • Throwing exceptions 可能是。
  • throw std::invalid_argument("i should equal 1 or 2"); 也许
  • 如果经常使用该方法,抛出异常是否会产生很大的开销?
  • 你可以throw。你可以assert。您可以将返回更改为std::optional。如果无法将 out_value 指针设置为ab,您可以将签名更改为bool try_get(int i, int*& out_value) 并返回false。您可以创建两个吸气剂,int& get_a() { return a; }int& get_b() { return b; }。这是一个经常出现的糟糕情况,还是只有当有人发出 oops 时才会出现“从未发生”的情况?
  • 吹毛求疵:将int 作为const int& 返回在我看来有点过度设计。假设 const int& 将在内部编译为一种指针,这可能会导致不必要的间接(访问 const 引用的内容)以及返回更多字节(例如在 64 位拱形上。其中int 通常仍然有 32 位)。此外,假设您在错误情况下不能或不想throw:使用int 只是return 一个积分。使用const int&,您需要一些可寻址的东西,例如static int dummy;.

标签: c++ exception return getter


【解决方案1】:

注意:您不需要将const int& 返回到您的成员类,int 就足够了。

C++ 方法是例外,但我不喜欢它们,我想根据某些情况提出其他方法:

  1. Getter 函数必须做一些操作然后返回结果;在这种情况下,我们可以返回一个std::pair<boo, Type_Of_Result>,它是布尔类型,表示“操作成功?”:
class A {
 private:
  int  m_value;

 public:
  A(const int value):
    m_value(value) {
  }

  template<typename T>
  using return_t = std::pair<bool, T>;

  return_t<int>  get() const {
    return { true, m_value };
  }
};
  1. 好的,我们得到了返回值状态,但是如果失败了,如何找到原因?:在这种情况下,我们可以创建一个Result 类来处理错误消息和返回值:
template <typename T>
struct Result {
  T return_value;
  bool its_okay;
  std::string message;
};

class A {
  // ...

  Result<int>  get() const {
    return { m_value, true, "All right" };
  }
};

【讨论】:

    猜你喜欢
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2017-02-27
    • 2013-01-23
    • 1970-01-01
    相关资源
    最近更新 更多