Идиомы и стили С++ | страница 17
В какой-то степени по этой причине, но так же и по некоторым другим соображениям, в C++ применяется прием двухэтапной инициализации. На мой взгляд это не есть идиома, а довольно простой прием, но есть весьма важная причина, почему я должен о нем рассказать: его не используют.
Особенно часто этим грешат начинающие Delphi-щики, и VB-шники: слишком велик соблазн щелкнуть по методу формы OnCreate, OnShow (Form_Create, Form_Show), и прописывать инициализации там, или, что еще ужаснее, залезть из одной формы в другую и там изменять значения переменных. Не делайте этого! Граждане дельфинщики! Форма - такой же класс, как и все остальные. Не лишайте ее законного конструктора, дайте ей заслуженную инициализацию! Не чмарите свой инструмент, и он воздаст Вам сторицей!
Ну ладно, чувствую я тут возбужденный такой забуду код нарисовать. Сначала пояснения. Пусть Ваш класс управляет Темными Силами, и они лежат в закрытой части объявления. Не ввязывайтесь в борьбу с ними в конструкторе, там они слишком злобно гнетут. Конструктор пусть инициализирует только примитивные типы, он к тому же их оптимизирует ловчее, но фактически его дело - только выделить память и получить указатель на объект. Инициализация Темных Сил - дело специальной функции, которая грамотно выполняет все нужные действия.
>class CClass {
>private:
>// Чудовищно сложные структуры, ресурсы,
>// мьютексы-шмутексы, все сплошь критическое,
>// пачками выбрасывающие исключения.
>public:
> CClass (); // Конструктор, которому на Ваши проблемы плевать.
> // Вот тут мы и замучаем свои ресурсы.
> int InitInstance (‹список аргументов›) throw (‹список исключений›);
>};
>// Где-то в коде:
>CClass* cc = new CClass;
>if (cc != NULL) {
> try {
> int ret_code = cc-›InitInstance();
> // Тут еще и код возврата можно обработать, если не лень,
> // но только если инициализация прошла успешно.