Выполните проверки перед списком инициализации - PullRequest
7 голосов
/ 02 января 2012

В моем собственном классе есть член класса A, конструктор которого принимает несколько параметров. Я пересылаю параметры своего собственного класса в конструктор класса A. Но важно, чтобы эти параметры были правильными, поэтому мне нужно проверить их перед созданием члена A. И вот проблема: Я мог бы опустить член в списке инициализации члена, фактически вызывая конструктор по умолчанию. После проверок в конструкторе я мог бы вызвать конструктор А в задании. Хотя это приводит к ошибке, поскольку деструктор A является частным.

Как мне решить эту проблему?

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

Ответы [ 2 ]

10 голосов
/ 02 января 2012

Вам понадобится доступный деструктор, что бы вы ни делали.Но чтобы ответить на ваш вопрос, можно было бы вызвать статическую функцию для проверки параметров из инициализатора:

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

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

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

Обратите внимание, что ,, используемый там, - это оператор запятой, а не разделитель аргументов -он вычисляет как левое, так и правое выражения и отбрасывает результат левого.

0 голосов
/ 02 января 2012

Я вижу два подхода к этому:

  1. Убедитесь, что класс A можно использовать с конструктором без параметров, и установите someParam в отдельном методе: A.SetSomeParam(someParam)

  2. Не наследуется от A, но содержит объект-член типа A, и вы можете создать его в любое время.

...