![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
mmortall |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 1.2.2012 Репутация: нет Всего: нет |
Есть класс-менеджер Монстров, который создает обекты тыпа Монстр. Указатель на Монстра передается в атакующие турели, которые стреляют в монстра. Помимо этого указатель на него
передается в менеджер мультиплеера, в селектор (выделение мышкой) и возможно дальнейшее расширение списка классов, где необходим указатель на монстра. Когда монстр убит какой ни будь турелью, она оповещает все классы о том, что монстр умер и в них указатель обноляется. Далее монстр выгружается из памяти. Мне такая система не нравится. Думаю что было бы идеально иметь какой ни будь контейнер, который бы инкапсулировал этот указатель + методы типа valid/invalid. Но в стандартный библиотеке я такого не нашел. Реф каунтиг тут делать не нужно, т.к. классы не равнозначны и основным держателем указателя есть Менеджер Монстров. Такая задача вроде часто встречается, подскажите, как элегантно и красиво её решить? Спасибо. Это сообщение отредактировал(а) mmortall - 1.2.2012, 14:33 |
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 3 Всего: 19 |
Я в таких случаях использую систему событий. Регистрирую событие man_down, подписываю на него всех заинтересованных сторон (колбэки), и примерно так использую:
Можешь посмотреть в сторону готовых решений: сигналы-слоты в boost или Qt. -------------------- You're face to face With man who sold the world |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Если пишешь на С++ (на С это тоже можно, но геморройней), то можно сделать иначе :
1. вместо простого указателя на монстра передается "умный с подсчетом ссылок" (например, boost::shared_ptr или std::shared_ptr в С++11). 2. класс монстр содержит свойство "жизнь" (думаю, он уже содержит). 3. когда монстр убит, то свойство "жизнь" принимает определенное значение (например: 0) 4. перед тем как выстрелить турель проверяет, а жив ли монстр по данному указателю, если не жив, то указатель удаляется из списка целей турели. Особенность умного указателя в том, что когда будет "потерян" последний указатель, указывающий на объект, то объект будет уничтожен. Таким образом, монстр будет удален из памяти тогда, когда все заинтересованные объекты удалят его из своих списков. Это сообщение отредактировал(а) bsa - 1.2.2012, 15:51 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
посмотрите weak_ptr к shared_ptr.. не слишком ли переусложнено ? |
|||
|
||||
Albor |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: 2 Всего: 9 |
А почему не передавать указатель по ссылке или указатель на указатель? Тогда все объекты будут работать с оригиналом данных Это сообщение отредактировал(а) Albor - 2.2.2012, 11:49 |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Еще можно сделать доступ к Мострам по уникальному ID из Менеджера Монстров. Когда Монстр создается, ему присваивается ID (например 64х битное число), которое уже не переиспользуется (например банальный счетчик). Для доступа к Монстру он запрашивается у Менеджера Монстров по ID, и Менеджер возвращает указатель или NULL (если Монстр был уничтожен)
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
xvr, это несколько дольше работает, чем с указателем
![]() |
|||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это да, но гарантирует централизованное управление временем жизни Монстров. И не требует введения для Монстров состояния Зомби (уже умерли, но еще не удалили ![]() |
|||
|
||||
borisbn |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 21 Всего: 135 |
Пожалуй, самый быстрый (как по реализации, так и по времени выполнения) вариант, но, если потребуется потокобезопасное обращение к объекту, то могут возникнуть трудности.
Вариант, возможно, и медленнее, но довольно несложно делается потокобезопасное обращение. Что-то типа такого
А вообще - интересная тема. Спасибо ТСу. -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
||||||
|
|||||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 20 Всего: 110 |
много лет мечтаю написать какую-нить игрулину. эх...мечты-мечты
![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |