在初始化列表之前执行检查

时间:2012-01-01 23:24:06

标签: c++ class constructor member-initialization

我在自己的类中有一个A类成员,构造函数接受多个参数。我将我自己的类的参数转发给A类的构造函数。但重要的是这些参数是正确的,所以我需要在构造A的成员之前检查它们。并且继承问题: 我可以省略成员初始化列表中的成员,有效地调用默认构造函数。在构造函数中检查之后,我可以在一个分配中调用A的构造函数。虽然,这会产生错误,因为A的析构函数是私有的。

我如何解决这个问题?

MyClass::MyClass(int someParam) : otherMember(2){
//checks for someParam
member = A(someParam); // <- produces error
}

2 个答案:

答案 0 :(得分:10)

无论你做什么,你都需要一个可访问的析构函数。但是要解决您的问题,一个选项是调用静态函数来检查初始化程序中的参数:

class MyClass {
  private:
    static void checkParam(int);
// ...
};

MyClass::MyClass(int someParam) : otherMember( (checkParam(someParam), 2) ) {
  // ...
}

static void MyClass::checkParam(int someParam) {
  if (...) throw someException();
}

请注意,那里使用的,是逗号运算符,而不是参数分隔符 - 它会计算左右表达式,并抛弃左边的结果。

答案 1 :(得分:0)

我认为有两种方法可以解决这个问题:

  1. 确保类A可以与无参数构造函数一起使用,并在单独的方法中设置someParamA.SetSomeParam(someParam)

  2. 不是从A继承,而是持有A类型的成员对象,然后您可以随时构建它。