![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Sergio |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 843 Регистрация: 28.7.2006 Где: Solar System-> Earth Репутация: 0 Всего: 1 |
Здравствуйте.
Что делать если нужно даные общие для всех? Насколько понимаю глобальны переменные не хорошо делать. Поэтому хочу использовать статические даные/методы Правильно ли я предполагаю? Когда нужно использовать статические и глобальные типи даные? Спасибо. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
пересмотреть алгоритм. ![]()
Задача не описана достачно, чтоб понять, правильный ли это выбор. Тогда, когда это и именно это действительно необходимо. Подробнее написано в книжках. Ваш вопрос, имхо, слишком абстрактный, ответ на него займет многие страницы. Я бы посоветовал поконкретней описать проблему. Это сообщение отредактировал(а) mes - 26.1.2009, 00:20 |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
к примеру можно создать класс со статическими элементами и методами.
если не ошибаюсь - это паттерн монотон. есть еще синглетон. |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Даже спрятанные синглетон/монотон глобальные переменные фактически остаются глобальными.
Допустим, вам Вы храните в глобальной переменной timeZone часовой пояс для вывода времени. Находясь в Москве, Вы настраиваете её на московский часовой пояс, во Владивостоке - на владивостокский. Но допустим, что в Москве Вам понадобилось вывести владивостокское время. Вы временно изменяете значение timeZone на Владивосток, выводите время и возвращаетесь на Москву. Но у Вас многопоточная программа, и другой нитке одновременно нужно вывести время, и она ошибочно выводит владивостокское время вместо московского. Использование синглетона проблему не решит. Для решения можно использовать переменные, глобальные в пределах одной нитки, но таковые не входят в стандарт C++ и программа будет зависеть от компилятора или ОС. |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Ваш пример является несколько надуманным ИМХО.
Если Вы сталкиваетесь с подобными ошибками (проблемами), необходимо пересмотреть проектирование приложения. Добавлено через 1 минуту и 21 секунду Да, есть случаи без глобальных переменных не обойтись вовсе, но их использование следует свести к минимуму и внести глобальные переменные покрайней мене в пространство имен (вынести из глобального) |
|||
|
||||
math64 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
namespace проблему тоже не решает - уже на этапе компиляции нужно указать namespace переменной явно или через using.
Мой пример дейтсивельно надуманный, c timeZone можно поступить проще, но он показывает с какими проблемами можно стокнуться при чрезмерном использовании локальных переменных, в том числе спрятанных в синглетонах и namespace'ах. Лучший способ - передавать данные в параметрах. Но передавать каждый раз один и тот же параметр неудобно. Можно передать данные в поле (не static!) класса, но множить поля класса тоже не хорошо. В общем, как лучше, в каждом конкретном случае нужно решать по-своему. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |