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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.07.2010, 20:56   #1
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
Вопрос Как обычно делаются такие локальные переменные в методах классов?

Мне нужно в одном из методов класса сделать локальную переменную, которая бы сохраняла свое значение между вызовами данного метода. Причем необходимо сделать так, чтобы эта переменная была локальной для каждого объекта данного класса; из-за этого требования отпадает вариант с использованием локальных статических переменных. Делать такую переменную переменной-членом класса тоже, вроде бы, - неверно, т.к. она не относится к описанию состояния объекта класса. В общем, хотелось бы узнать: как обычно делают такие переменные? Поделитесь, плиз, опытом...
Oleg_SK вне форума Ответить с цитированием
Старый 10.07.2010, 21:01   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Если эта переменная сохраняет значение между вызовами метода, значит она хранит состояние объекта и должна быть описана как член класса. Другого не дано. Разве что перепроектировать класс, чтобы не требовалась эта переменная.
pu4koff вне форума Ответить с цитированием
Старый 10.07.2010, 21:05   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

приватный член класса.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 10.07.2010, 21:15   #4
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Благодарю за ответы. Я тоже все больше склоняюсь сделать эту переменную членом класса, т.к. других вариантов не вижу. Однако, в этом случае, данная переменная перестает быть локальной и становится доступной всем методам данного класса, а это не есть гуд... Странно, что в C++ не предусмотрены такие локальные переменные.

Последний раз редактировалось Oleg_SK; 10.07.2010 в 21:18.
Oleg_SK вне форума Ответить с цитированием
Старый 10.07.2010, 22:42   #5
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Я так на вскидку не придумаю ситуацию, когда такие локальные переменные могли бы понадобиться. Если эта переменная не хранит состояние объекта класса и используется в одном единственном методе, то может методу не место в классе и он должен быть функцией?
Реализация таких переменных проблематична и излишне усложняет ООП. Нужно вводить что-то вроде контекста выполнения, передавать этот контекст, разрешать выполнение определенных участков кода/доступ к переменным только в определенном контексте,... Сложно и не особо нужно, как мне кажется.
pu4koff вне форума Ответить с цитированием
Старый 11.07.2010, 02:49   #6
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Возник еще один вопрос: как в обычной функции сделать локальную переменную сохраняющую свое значение между вызовами, при следующих условиях:
эта функция используется в многопоточной программе и вызывается множеством потоков. Требуется сделать так, чтобы значение этой локальной переменной могло быть уникальным для каждого потока вызывающего данную функцию. То есть в функции нужна как бы статическая локальная переменная, значение которой было бы локальным для каждого потока выполнения вызывающего данную функцию. Можно конечно (по крайней мере, в Win32-приложениях), если мне память не изменяет, сохранять такие данные в TLS, но тогда они станут доступными всему коду выполняющемуся в данном потоке, а не только конкретной функции...

Последний раз редактировалось Oleg_SK; 11.07.2010 в 04:01.
Oleg_SK вне форума Ответить с цитированием
Старый 11.07.2010, 03:31   #7
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

Проcьба к модератору: плиз, удалите этот пост и переименуйте эту тему с "Как обычно делаются такие локальные переменные в методах классов?" в "Как обычно делают такие локальные переменные?", т.к. вопросы в ней уже касаются не только классов.

Последний раз редактировалось Oleg_SK; 11.07.2010 в 03:44.
Oleg_SK вне форума Ответить с цитированием
Старый 11.07.2010, 04:03   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Oleg_SK Посмотреть сообщение
Возник еще один вопрос: как в обычной функции сделать локальную переменную сохраняющую свое значение между вызовами, при следующих условиях:
эта функция используется в многопоточной программе и вызывается множеством потоков. Требуется сделать так, чтобы значение этой локальной переменной могло быть уникальным для каждого потока вызывающего данную функцию. То есть в функции нужна как бы статическая локальная переменная, значение которой было бы локальным для каждого потока выполнения вызывающего данную функцию.
Для сиих целей(уникальная переменная для каждого потока) придумали TLS(Thread Local Storage). В MS VS, если не ошибаюсь (сейчас нет компилятора, чтобы проверить), для помещения переменной в TLS нужно объявлять её так:
Код:
__declspec(thread) static int var;
Как в других компиляторах не скажу
netrino вне форума Ответить с цитированием
Старый 11.07.2010, 04:09   #9
Oleg_SK
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 42
По умолчанию

netrino, благодарю! Вы просто читаете мои мысли; как раз хотел спросить: как заставить компилятор сохранять статические локальные переменные в TLS, а вы уже ответили...
Oleg_SK вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объясните. Ну не понимаю я как сайты на си делаются? newprog12 Общие вопросы C/C++ 16 25.01.2010 10:46
как отформатировать локальные диски??? alex(21) Операционные системы общие вопросы 8 11.11.2009 09:56
Маршрутизация.Как юзать локальные ресурсы? Zerone Свободное общение 10 06.10.2009 19:27
Локальные и глобальные переменные. Proger10 Общие вопросы Delphi 1 04.05.2009 05:55
как делаются содержания trunx Microsoft Office Word 17 01.12.2008 23:57