Форум программистов, компьютерный форум CyberForum.ru

Порядок вызова конструкторов/деструкторов - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Praktolock
 Аватар для Praktolock
58 / 58 / 0
Регистрация: 29.11.2011
Сообщений: 272
05.07.2013, 08:25     Порядок вызова конструкторов/деструкторов #1
Вопрос чисто теоретический. Попробую сформулировать, не ругайте если получится коряво.
Например, есть некий класс для писанины в лог, который в конструкторе открывает файл, а в деструкторе его закрывает. Ну какнибудь, примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void _PrintLog(char*str);
 
class CLOG
{
public:
 FILE logfile;
 CLOG(){logfile=fopen("некийфайл.txt", "r");};
 ~CLOG(){fclose(logfile)};
 print(char*);
};
 
CLOG clog;
 
void _PrintLog(char*str)
{
 clog.print(str);
};
И всё это в отдельном .cpp файле, и я хочу чтобы другие классы могли печатать в этот лог (в том числе и из своих деструкторов) с помощью глобальной функции _PrintLog(char*). Но если деструктор ~CLOG() сработает раньше он закроет файл, после чего другие деструкторы не смогут вывести ничего в лог, ну и с конструкторами аналогично. Можно ли как-нибудь задать компилятору в каком порядке статические объекты из разных модулей должны создаваться и уничтожаться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.07.2013, 08:25     Порядок вызова конструкторов/деструкторов
Посмотрите здесь:

C++ Оценить правильность использования конструкторов, деструкторов в коде
Порядок вызова конструкторов при множественном наследовании C++
C++ Правильное использование конструкторов и деструкторов
Разработка классов, создание конструкторов и деструкторов C++
C++ Порядок вызова конструкторов
C++ Как реализовать набор конструкторов и деструкторов
C++ Вызов конструкторов/деструкторов при наследовании
Задание с использованием конструкторов и деструкторов C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nxtech
77 / 59 / 2
Регистрация: 26.06.2013
Сообщений: 198
05.07.2013, 12:48     Порядок вызова конструкторов/деструкторов #2
Цитата Сообщение от Praktolock Посмотреть сообщение
Можно ли как-нибудь задать компилятору в каком порядке статические объекты из разных модулей должны создаваться и уничтожаться?
Ответ в лоб - нет. Читайте стандарт C++ (3.6, 3.7) по этому вопросу.
Если в кратце
Не локальные объекты со static storage duration инициализируются до вызова main, уничтожаются в результате возврата из main или вызова exit.
Не локальные объекты со static storage duration уничтожаются в порядке, обратном их инициализации.
Инициализация не локальных объектов со static storage duration, определенных в одной единице трансляции выполняется в порядке их объявления.
Порядок инициализации для объектов со static storage duration, определенных в разных единицах трансляции, не определен.
Динамическая инициализация объектов со static storage duration выполняется после статической инициализации.

Но существуют обходные решения. По данной теме можно почитать Майерса, Александреску + куча статей в интернете.
Yandex
Объявления
05.07.2013, 12:48     Порядок вызова конструкторов/деструкторов
Ответ Создать тему
Опции темы

Текущее время: 21:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru