Используйте счетчики экземпляров объектов для инициализации на уровне класса
Несколько разделов назад я рассматривал использование счетчика статических глобальных объектов для управления инициализациями на уровне библиотеки. В Си++ у нас есть лучшие варианты, потому что мы может использовать определение класса для ограничения области действия:
class window
{
static int
num_windows;
public:
window();
~window();
};
int window::num_windows = 0;
window::window()
{
if( ++num_windows == 1 ) // только что создано первое окно
initialize_video_system();
}
window::~window()
{
if( --num_windows == 0 ) // только что уничтожено
shut_down_video_system(); // последнее
окно
}
Наконец, счетчик экземпляров объектов может быть также использован в качестве счетчика числа вызовов для обеспечения инициализации на уровне подпрограммы:
f()
{
static int
have_been_called = 0;
if( !have_been_called )
{
have_been_called = 1;
do_one_time_initializations();
}
}