Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Статические методы, как избежать глобальных даных 
:(
    Опции темы
Sergio
  Дата 26.1.2009, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 843
Регистрация: 28.7.2006
Где: Solar System-> Earth

Репутация: 0
Всего: 1



Здравствуйте.
Что делать если нужно даные общие для всех? Насколько понимаю глобальны переменные не хорошо делать. Поэтому хочу использовать статические даные/методы Правильно ли я предполагаю? 
Когда нужно использовать статические и глобальные типи даные?
Спасибо.
PM MAIL ICQ   Вверх
mes
Дата 26.1.2009, 00:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Sergio @  25.1.2009,  23:07 Найти цитируемый пост)
Что делать если нужно даные общие для всех?

пересмотреть алгоритм.

Цитата(Sergio @  25.1.2009,  23:07 Найти цитируемый пост)
Насколько понимаю глобальны переменные не хорошо делать.

 smile 

Цитата(Sergio @  25.1.2009,  23:07 Найти цитируемый пост)
Поэтому хочу использовать статические даные/методы Правильно ли я предполагаю? 

 Задача не описана достачно, чтоб понять, правильный ли это выбор.

Цитата(Sergio @  25.1.2009,  23:07 Найти цитируемый пост)
Когда нужно использовать статические и глобальные типи даные?

Тогда, когда это  и именно это действительно необходимо. Подробнее написано в книжках. 
Ваш вопрос, имхо, слишком абстрактный,  ответ на него займет многие страницы.
Я бы посоветовал поконкретней описать проблему.

Это сообщение отредактировал(а) mes - 26.1.2009, 00:20


--------------------
PM MAIL WWW   Вверх
mrbrooks
Дата 26.1.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 2
Всего: 306



Цитата(Sergio @  26.1.2009,  00:07 Найти цитируемый пост)
Что делать если нужно даные общие для всех?

к примеру можно создать класс со статическими элементами и методами. 
Код

class tmp
{
private:
static int a;
static double b;
public:
static void SetA(int a_t){a=a_t}; 
static void SetB(double b_t){b=b_t};
static int GetA(return a;);
static double GetB(return b;);
};
int tmp::a;
double tmp::b;
//и т.д. по методам.


если не ошибаюсь - это паттерн монотон.
есть еще синглетон.
PM MAIL   Вверх
math64
Дата 27.1.2009, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Даже спрятанные синглетон/монотон глобальные переменные фактически остаются глобальными.
Допустим, вам Вы храните в глобальной переменной timeZone часовой пояс для вывода времени.
Находясь в Москве, Вы настраиваете её на московский часовой пояс, во Владивостоке - на владивостокский.
Но допустим, что в Москве Вам понадобилось вывести владивостокское время.
Вы временно изменяете значение timeZone на Владивосток, выводите время и возвращаетесь на Москву.
Но у Вас многопоточная программа, и другой нитке одновременно нужно вывести время, и она ошибочно выводит владивостокское время вместо московского. Использование синглетона проблему не решит.
Для решения можно использовать переменные, глобальные в пределах одной нитки, но таковые не входят в стандарт C++ и программа будет зависеть от компилятора или ОС.
PM   Вверх
cutwater
Дата 27.1.2009, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 592
Регистрация: 24.6.2008

Репутация: 1
Всего: 10



Ваш пример является несколько надуманным ИМХО.
Если Вы сталкиваетесь с подобными ошибками (проблемами), необходимо пересмотреть проектирование приложения.

Добавлено через 1 минуту и 21 секунду
Да, есть случаи без глобальных переменных не обойтись вовсе, но их использование следует свести к минимуму и внести глобальные переменные покрайней мене в пространство имен (вынести из глобального)


--------------------
user posted image
PM MAIL   Вверх
math64
Дата 27.1.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



namespace проблему тоже не решает - уже на этапе компиляции нужно указать namespace переменной явно или через using.
Мой пример дейтсивельно надуманный, c timeZone можно поступить проще, но он показывает с какими проблемами можно стокнуться при чрезмерном использовании локальных переменных, в том числе спрятанных в синглетонах и namespace'ах.

Лучший способ - передавать данные в параметрах.
Но передавать каждый раз один и тот же параметр неудобно.
Можно передать данные в поле (не static!) класса, но множить поля класса тоже не хорошо.
В общем, как лучше, в каждом конкретном случае нужно решать по-своему.

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0807 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.