9.5 Выводы

Предыдущая  Содержание  Следующая V*D*V

Статические объекты, такие как описания классов, обычно инициализировались бы во время компиляции. Если нам необходимы вызовы конструкторов, мы оборачиваем их в функции без параметров и удостоверяемся, что эти функции вызваны достаточно рано и в надлежащем порядке. Чтобы избежать тривиальных, но трудно диагностируемых ошибок, мы должны предоставить механизм, который выполняет эти вызовы функции автоматически — наши программы должны самоорганизующимися.

Одно решение состоит в том, чтобы использовать технику компоновки, например, при помощи такой программы, как munch, чтобы создать массив с адресами всех функций инициализации и вызвать каждый элемент массива в начале главной программы. Функция main() с циклом, обрабатывающим массив, может быть частью библиотеки нашего проекта, а каждая программа начинаться с функции mainprog(), которая вызывает main().

Другое решение состоит в том, чтобы позволить функции инициализации возвращать проинициализированный объект. Если функция написана так, что она выполняет фактическую работу только один раз, мы можем заменить каждую ссылку на статический объект вызовом его функции инициализации. Альтернативно, можно использовать макрос для получения такого же результата более эффективно. Так или иначе мы больше не можем взять адрес ссылки на статический объект, но поскольку сама ссылка представляет собой указатель, это едва ли должно быть необходимо.

 

Предыдущая  Содержание  Следующая