Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2012, 21:32   #11
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers

еще утверждаешь, что проблем с вектором в этом случае нет?
гм... а почему std::cout не валится?
Его можно юзать, где угодно и когда угодно. Глобальный объект, который "как бэ гарантированно созданный"
_Bers вне форума Ответить с цитированием
Старый 27.06.2012, 21:38   #12
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
Цитата:
гм... а почему std::cout не валится?
я тебе в каком то посте уже говорил, что основные потоки (cin, cout, cerr) просто объявлены (как extern) в каком-нить iostream, а сами объекты располагаются в какой нить libcpp, т.е порядок инициализации уже не важен, главное, чтоб такое имя нашлось при линковке. несколькими постами выше я тебе показал пример, как избежать проблемы в твоем случае, если использовать extern, который ты почему-то проигнорил
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 27.06.2012, 21:40   #13
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
основные потоки (cin, cout, cerr) просто объявлены (как extern) в каком-нить iostream, а сами объекты располагаются в какой нить libcpp, т.е порядок инициализации уже не важен
То есть, если глобальный объект запихать в либу, то проблем не будет?
_Bers вне форума Ответить с цитированием
Старый 27.06.2012, 21:42   #14
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
необязательно в либу. достаточно сделать хидер, где объявлены все глобальные объекты как extern, и сделать cpp, где эти объекты определены (для удобства). ну я же привел пример, смотри выше, никакой либы в нем нет
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.06.2012, 09:31   #15
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2_Bers
необязательно в либу. достаточно сделать хидер, где объявлены все глобальные объекты как extern, и сделать cpp, где эти объекты определены (для удобства). ну я же привел пример, смотри выше, никакой либы в нем нет
std::cout (равно, как и вообще возможные объекты этого класса) не требует от программиста каких либо знаний в области стандарта, и не создает проблем.

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

Использование такого объекта для пользователя - аналогично использованию объекта любого другого класса.

То есть, пользователь может делать объект глобальным, или пихать его в конструктор другого глобального объекта, и не думать о том, что "у него же там в конструкторе итак глобальный пользуется - как бы не вышла беда!"

Тем более, что инкапсуляция позволяет пользователю ничего не знать об устройстве используемого класса. std::vector из твоего примера - пример того, как может произойти поломка, которая может привести пользователя просто в недоумение.

Он объявляет глобальный объект в майне, и этот объект тихо-мирно начинает глючить. И вынуждает пользователя нарушать инкапсуляцию, и лезть во внутренности класса. А потом думать: "вот блин! Понаделали говнокода из глобальных объектов!"

Так делать нельзя. Надо, что бы было просто, как у std:stream всяких
_Bers вне форума Ответить с цитированием
Старый 28.06.2012, 12:43   #16
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2_Bers
Цитата:
std::cout не создает проблем.
потому что пользователи вручную его не объявляют, они пользуются определением (iostream, extern _CRTIMP2 ostream cout, msvc 7.1). объяви объект типа ostream в примере с "нерабочим" вектором, будешь иметь те же самые проблемы.

Цитата:
Так делать нельзя. Надо, что бы было просто, как у std:stream всяких
ну я тебе показал, "как у std:stream всяких" сделано
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 28.06.2012, 14:35   #17
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

_Bers, вектор тоже валиться будет, если попытаться разыменовать указатель на буфер (поскольку до прохода конструктором он будет равен нулю, если объект статический). Объекты cin, cout, cerr, clog и их широкие друзья не валятся, потому что их инициализация происходит при включении iostream, но для этого костыль используется - в заголовке сидит глобальная переменная типом ios_base::Init (или как-то так) и инициализирует вышеперечисленные объекты в своём конструкторе (при этом ведётся счётчик вызовов конструктора, чтобы гарантировать единственность инициализации).
netrino вне форума Ответить с цитированием
Старый 28.06.2012, 20:44   #18
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Счетчик Шварца?
_Bers вне форума Ответить с цитированием
Старый 28.06.2012, 22:52   #19
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от _Bers Посмотреть сообщение
Счетчик Шварца?
Да. .
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как подружить Ribbon и Alpha Controls artemavd Компоненты Delphi 0 17.06.2012 17:44
Как грамотно подружить Firebird и Interbase на 1 ПК? Alexei91 БД в Delphi 3 20.08.2010 13:29
Исключение при удалении из std::map arokot Общие вопросы C/C++ 2 11.08.2010 17:36
сортировка std::map NiCola999 Общие вопросы C/C++ 2 27.04.2010 23:14
Как подружить SendMessage и TIdHTTP zcoder Работа с сетью в Delphi 1 13.04.2009 06:01