глобальный самосозданный объект

Я делаю проект Windows VC++ 2008, и я хочу, чтобы объект, который я создаю, существовал для всех интенсивных и глобальных целей. этот объект должен быть таймером для контроля того, как долго работает программа, и должен быть доступен другим объектам для создания файла журнала. Я знаю, что могу пометить собственные и sudo-native (строковые) члены как внешние, чтобы сделать их доступными, но как мне заставить объект существовать глобально для других объектов. Должен ли я помещать определение объекта перед классом объекта, который должен знать о его существовании (обеспечивая загрузку класса в первую очередь), или я должен поместить в свой основной метод, который разрешает доступ к объекту?


person gardian06    schedule 06.02.2012    source источник
comment
sudo существует только в Unix-подобных средах. В Windows вам нужно обратить внимание на управление учетными записями пользователей (UAC), но вы должны быть очень осторожны. Я сомневаюсь, что вам это нужно для простого таймера.   -  person Kerrek SB    schedule 06.02.2012


Ответы (2)


То, что вы описываете, часто делается с использованием синглтона.

Вот пример того, как его написать: Singleton: как его использовать

Вот еще один: может ли любой один предоставить мне образец Singleton в С++?

Также обратите внимание: Что плохого в синглтонах?

person Johan Lundberg    schedule 06.02.2012
comment
Это в значительной степени способ сделать это. - person Arafangion; 06.02.2012

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

extern MyClass yourInstance;

Глобальное определение должно быть там, где main()

MyClass yourInstance;

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

тем не менее, обычно нехорошо иметь глобальные объявления, вместо этого вы должны объявить MyClass в main(), а затем передать указатель на него всем функциям/классам, которые вы используете. я бы так и сделал. Тогда вам не нужен оператор extern и просто включите заголовок MyClass.h

одна проблема с глобальными экземплярами заключается в том, что у вас практически нет контроля над тем, когда они создаются/уничтожаются.

person AndersK    schedule 06.02.2012