2012-01-01 3 views
7

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

Как это решить?

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

Поговорите с автором класса 'A' ​​и принудите ее к тому, чтобы собственный конструктор' A' вел себя разумно в случае недопустимых значений параметров. –

+0

Было бы приемлемо построить 'A', а затем проверить после факта? – Cameron

+0

Я действительно пытался убедить Sun сделать это приемлемым на Java, но они отказались. Это немного проще обмануть на Java, потому что вы можете вызвать один конструктор из другого. – Neil

ответ

9

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

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

Будут ли исключения в checkParam() все еще прерывать программный процесс? Если ответ на этот вопрос да, это именно то, что мне нужно. Для тех из вас, кто задается вопросом о частном деструкторе, его ссылка считается возражением; Я бы сказал, что лучше использовать указатель подсчета ссылок. – Paranaix

+0

Да. checkParam будет оцениваться до '2', поэтому, если он выбрасывает,' 2' не будет оцениваться, и поэтому конструктор 'otherMember' не может быть вызван – bdonlan

0

Я вижу два пути приближения к этому:

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

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

Смежные вопросы