инициализация объекта - PullRequest
4 голосов
/ 16 марта 2011

В книге «Язык С ++» автор заявляет:

Иногда, когда вы проектируете библиотеку, необходимо или просто удобно изобретать тип с помощью конструктора идеструктор с единственной целью инициализации и очистки.Такой тип будет использоваться только один раз: для выделения статического объекта, чтобы вызывались конструктор и деструктор.

Мне интересно, на какой сценарий ссылается это утверждение?Или как это утверждение помогает в разработке программного обеспечения?

В книге также приведен пример

class Zlib_init{
    Zlib_init( );
    ~Zlib_init( );
};

class Zlib{
    static Zlib_init x;
}

И в книге говорится, что

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

Почему это может произойти?

Спасибо за разъяснения.

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Стандарт C ++ не определяет порядок, в котором создаются статические объекты. Поэтому, если вам нужна некоторая иерархия в статических объектах, вам нужно, чтобы они зависели друг от друга (например, один должен быть членом другого). Конструкция из книги гарантирует такое поведение.

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

См. C ++ faq запись для второй части вашего вопроса.

0 голосов
/ 16 марта 2011

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

Например, если у вас есть экземпляр вашего класса в static хранилище в одном модуле и вы хотите использовать его из конструктора другого класса в static хранилище в другом модуле.В этом случае вы подразумеваете, что первый экземпляр будет инициализирован перед вторым.Но у языка нет средств для указания этого порядка, если экземпляры определены в отдельных модулях.

Иногда, когда вы проектируете библиотеку, необходимо или просто удобно изобретатьтип с конструктором и деструктором с единственной целью инициализации и очистки.Такой тип будет использоваться только один раз: для выделения статического объекта, чтобы вызывался конструктор и деструктор.

Это полезно, когда вы работаете с 3-ю частично работоспособными библиотеками, требующими инициализациии завершение звонков.Например, WinSock 2 требует WSAStartup, прежде чем вы сможете вызывать другие функции WSA и WSACleanup, когда вы закончите с WinSock в своем процессе.Если у вас есть статический экземпляр этого типа класса, вызывающий WSAStartup в конструкторе и WSACleanup в деструкторе, вы должны иметь возможность использовать функции WSA в других местах вашей программы (кроме конструкторов / деструкторов других статических объектов).

...