7

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

我该如何解决这个问题?

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

2 回答 2

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();
}

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

于 2012-01-01T23:27:56.233 回答
0

我看到了两种解决方法:

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

  2. 不是继承自A,而是持有一个类型的成员对象A,然后你可以随时构造它。

于 2012-01-01T23:29:42.363 回答