检查构造函数与set函数

时间:2017-02-14 12:42:42

标签: c++ validation constructor

这是一个非常简单的问题。假设我有一个班级

class A
{
public:
  A(int);
  void setA(int);
private:
  int a;
};

实施

A::A(int a_) : a(a_) { }
void A::setA(int a_) { a = a_; }

假设我想避免使用a = 0但我不想抛出异常,我只想在a = 1保留一个有效的对象而不是那种情况(这没关系为什么现在)。

然后我可以在构造函数和setA中添加if语句来检查参数是否为0,并在这种情况下将其设置为1。从概念上讲,这告诉我在这种情况下我应该更改构造函数,而不是在那里初始化a,我应该在构造函数中调用setA。通过这种方式,检查的代码只写一次(请记住,这是一个简单的情况,但在其他情况下验证可能会更复杂)。

现在,该方法涉及在构造函数中进行额外的函数调用。编写验证码两次效率更高吗?如果setA只是偶尔使用的话怎么办?

2 个答案:

答案 0 :(得分:1)

在构造函数中使用验证调用setter肯定会更好,因为代码重复是邪恶的。你也可以让它内联以确保你不浪费CPU周期,但我认为这是一个不成熟的优化。

答案 1 :(得分:1)

我同意你的热情以防止代码重复。只要小心过火,单线可能会过火。

如果你要进行检查,你应该使用实现文件函数或privatestatic方法来执行此操作:

int preventZero(const int a_) { return a_ == 0 ? 1 : a_; }

然后您可以在实现中使用它,如下所示:

A::A(int a_) : a(preventZero(a_)) { }
void A::setA(int a_) { a = preventZero(a_); }