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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Контроль множестова копий указателя, Как это делать привильно? 
:(
    Опции темы
mmortall
Дата 1.2.2012, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Есть класс-менеджер Монстров, который создает обекты тыпа Монстр. Указатель на Монстра передается в атакующие турели, которые стреляют в монстра. Помимо этого указатель на него 
передается в менеджер мультиплеера, в селектор (выделение мышкой) и возможно дальнейшее расширение списка классов, где необходим указатель на монстра. 

Когда монстр убит какой ни будь турелью, она оповещает все классы о том, что монстр умер и в них указатель обноляется. Далее монстр выгружается из памяти. 
Мне такая система не нравится. Думаю что было бы идеально иметь какой ни будь контейнер, который бы инкапсулировал этот указатель + методы типа valid/invalid. 
Но в стандартный библиотеке я такого не нашел. 
Реф каунтиг тут делать не нужно, т.к. классы не равнозначны и основным держателем указателя есть Менеджер Монстров.

Такая задача вроде часто встречается, подскажите, как элегантно и красиво её решить? Спасибо.

Это сообщение отредактировал(а) mmortall - 1.2.2012, 14:33
PM MAIL   Вверх
newbee
Дата 1.2.2012, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


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

Репутация: 3
Всего: 19



Я в таких случаях использую систему событий. Регистрирую событие man_down, подписываю на него всех заинтересованных сторон (колбэки), и примерно так использую:
Код

void remove_monster(struct moster *monster){
 process_action(man_down, monster);
 free(monster);}


Можешь посмотреть в сторону готовых решений: сигналы-слоты в boost или Qt.


--------------------
You're face to face
With man who sold the world
PM   Вверх
bsa
Дата 1.2.2012, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Если пишешь на С++ (на С это тоже можно, но геморройней), то можно сделать иначе :
1. вместо простого указателя на монстра передается "умный с подсчетом ссылок" (например, boost::shared_ptr или std::shared_ptr в С++11).
2. класс монстр содержит свойство "жизнь" (думаю, он уже содержит).
3. когда монстр убит, то свойство "жизнь" принимает определенное значение (например: 0)
4. перед тем как выстрелить турель проверяет, а жив ли монстр по данному указателю, если не жив, то указатель удаляется из списка целей турели.

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

Это сообщение отредактировал(а) bsa - 1.2.2012, 15:51
PM   Вверх
mes
Дата 1.2.2012, 17:06 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(mmortall @  1.2.2012,  13:32 Найти цитируемый пост)
Реф каунтиг тут делать не нужно, т.к. классы не равнозначны 

посмотрите weak_ptr к shared_ptr..

Цитата(mmortall @  1.2.2012,  13:32 Найти цитируемый пост)
Есть класс-менеджер Монстров, который создает обекты тыпа Монстр. Указатель на Монстра передается в атакующие турели, которые стреляют в монстра. Помимо этого указатель на него 
передается в менеджер мультиплеера, в селектор (выделение мышкой) и возможно дальнейшее расширение списка классов, где необходим указатель на монстра. 

не слишком ли переусложнено ?




--------------------
PM MAIL WWW   Вверх
Albor
Дата 2.2.2012, 11:48 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mmortall @  1.2.2012,  13:32 Найти цитируемый пост)
Указатель на Монстра передается в атакующие турели, которые стреляют в монстра. Помимо этого указатель на него 
передается в менеджер мультиплеера, в селектор (выделение мышкой) и возможно дальнейшее расширение списка классов, где необходим указатель на монстра. 

А почему не передавать указатель по ссылке или указатель на указатель? Тогда все объекты будут работать с оригиналом данных


Это сообщение отредактировал(а) Albor - 2.2.2012, 11:49
PM MAIL ICQ   Вверх
xvr
Дата 2.2.2012, 11:56 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Еще можно сделать доступ к Мострам по уникальному ID из Менеджера Монстров. Когда Монстр создается, ему присваивается ID (например 64х битное число), которое уже не переиспользуется (например банальный счетчик). Для доступа к Монстру он запрашивается у Менеджера Монстров по ID, и Менеджер возвращает указатель или NULL (если Монстр был уничтожен)

PM MAIL   Вверх
bsa
Дата 2.2.2012, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



xvr, это несколько дольше работает, чем с указателем smile 
PM   Вверх
xvr
Дата 2.2.2012, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(bsa @ 2.2.2012,  12:04)
xvr, это несколько дольше работает, чем с указателем smile

Это да, но гарантирует централизованное управление временем жизни Монстров. И не требует введения для Монстров состояния Зомби (уже умерли, но еще не удалили  smile )

PM MAIL   Вверх
borisbn
Дата 2.2.2012, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 21
Всего: 135



Цитата(Albor @  2.2.2012,  11:48 Найти цитируемый пост)
А почему не передавать указатель по ссылке или указатель на указатель? Тогда все объекты будут работать с оригиналом данных

Пожалуй, самый быстрый (как по реализации, так и по времени выполнения) вариант, но, если потребуется потокобезопасное обращение к объекту, то могут возникнуть трудности.
Цитата(xvr @  2.2.2012,  11:56 Найти цитируемый пост)
Еще можно сделать доступ к Мострам по уникальному ID из Менеджера Монстров

Вариант, возможно, и медленнее, но довольно несложно делается потокобезопасное обращение. Что-то типа такого
Код
Monster * MonstersManager::lock( long long ID );
void MonstersManager::unlock( long long ID );

А вообще - интересная тема. Спасибо ТСу.




--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
boostcoder
Дата 2.2.2012, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

Репутация: 20
Всего: 110



много лет мечтаю написать какую-нить игрулину. эх...мечты-мечты smile 
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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