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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Praktolock
65 / 65 / 1
Регистрация: 29.11.2011
Сообщений: 300
#1

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

05.07.2013, 08:25. Просмотров 1478. Ответов 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++
Всем доброго дня. Наткнулся в коде на интересные грабли: test.cpp #include "test.h" Test test; Test::Test() {

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

Порядок вызова конструкторов - C++
Есть классы First и Second. Класс Second наследуется от First. Я имею ввиду: class Second: public First { //... };

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

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

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

Наследование - вызов конструкторов и деструкторов - C++
Делаю два класса - предок и потомок: class class_1_type { private: int t; public: class_1_type(int t_) { t = t_; cout <<...

Задание с использованием конструкторов и деструкторов - C++
Нужна ваша помощь. Само задание: Разработать класс - СТУДЕНТ. В закрытой части определить данные: фамилия, номер зачетной книжки,...

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

Ошибки в программе с использованием конструкторов/деструкторов - C++
Приветы Есть код: #include <iostream> #include <cmath> #include <stdlib.h>

Вызов конструкторов/деструкторов при наследовании - C++
Объясните пожалуйста, как получается вывод на экран 2531 #include <iostream> class A { public: A(int n = 2) : m_i(n) {...

Разработка классов, создание конструкторов и деструкторов - C++
Здравствуйте, помогите решить следующее задание: Постpоить класс для pаботы со cтpоками. Класс должен включать следующие поля: массив...


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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 выполняется после статической инициализации.

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

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