Выполните проверки перед списком инициализации
У меня есть член класса A в моем собственном классе, конструктор которого принимает несколько параметров. Я пересылаю параметры моего собственного класса в конструктор класса A. Но важно, чтобы эти параметры были правильными, поэтому мне нужно проверить их перед созданием члена A. И вот проблема: я мог бы опустить член в члене список инициализации, эффективно вызывающий конструктор по умолчанию. После проверок в конструкторе я мог бы вызвать конструктор А в задании. Хотя это приводит к ошибке, поскольку деструктор A является частным.
Как мне решить это?
MyClass::MyClass(int someParam) : otherMember(2){
//checks for someParam
member = A(someParam); // <- produces error
}
2 ответа
Вам понадобится доступный деструктор, что бы вы ни делали. Но чтобы ответить на ваш вопрос, можно было бы вызвать статическую функцию для проверки параметров из инициализатора:
class MyClass {
private:
static void checkParam(int);
// ...
};
MyClass::MyClass(int someParam) : otherMember( (checkParam(someParam), 2) ) {
// ...
}
static void MyClass::checkParam(int someParam) {
if (...) throw someException();
}
Обратите внимание, что ,
здесь используется оператор запятой, а не разделитель аргументов - он вычисляет как левое, так и правое выражения и отбрасывает результат левого.
Я вижу два способа приблизиться к этому:
Убедитесь, что класс
A
может использоваться с конструктором без параметров, и установитьsomeParam
в отдельном методе:A.SetSomeParam(someParam)
Не наследовать от
A
, а лучше держите объект-член типаA
и тогда вы можете построить его, когда захотите.