Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
73 / 73 / 18
Регистрация: 29.11.2011
Сообщений: 356
1

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

05.07.2013, 08:25. Показов 2687. Ответов 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() сработает раньше он закроет файл, после чего другие деструкторы не смогут вывести ничего в лог, ну и с конструкторами аналогично. Можно ли как-нибудь задать компилятору в каком порядке статические объекты из разных модулей должны создаваться и уничтожаться?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.07.2013, 08:25
Ответы с готовыми решениями:

Порядок вызова конструкторов
Всем доброго дня. Наткнулся в коде на интересные грабли: test.cpp #include "test.h" Test...

Порядок вызова конструкторов
Есть классы First и Second. Класс Second наследуется от First. Я имею ввиду: class Second:...

Порядок вызова конструкторов
на срр-reference нашёл тему про виртуальный деструктор, но я так и не понял (да там и не...

Классы, наследование, порядок вызова конструкторов
допустим у меня эсть два класса class a { publc: char *n; a() { n= new char ; } ~a()

1
78 / 60 / 9
Регистрация: 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 выполняется после статической инициализации.

Но существуют обходные решения. По данной теме можно почитать Майерса, Александреску + куча статей в интернете.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.07.2013, 12:48

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Порядок вызова конструкторов при множественном наследовании
Здравствуйте, меня интересует вопрос, как изменить последовательность вызова конструкторов базовых...

Порядок вызова конструкторов при присваивании объектов одного класса
Имеется код ниже. Wein dres = rom; Где dres и rom объекты класса Wein. Класс Wein имеет...

Странный порядок вызова конструкторов и передача временного обьекта в функцию в качестве неконстантной ссылки
Есть код //g++ 5.4.0 #include <iostream> struct foo { foo(int){std::cout << "int...

Правильное использование конструкторов и деструкторов
#include "stdafx.h" #include <iostream> #include <conio.h> using namespace std; class Worker...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.