powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / push_back(new ... )
6 сообщений из 6, страница 1 из 1
push_back(new ... )
    #32834492
Man555
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
делаю игрушку. всех игроков храню в списке std::list<player*>, где player базовый класс. От него наследуются human player и machine player. Нужно добавить игрока-компьютера вызовом метода add_machine_player()

Ничего умнее вот этого пока не придумал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
class game {
   private:
        std::list<player*> p;
   public:
       game();
       ~game();       
       ....
};
template<class T> struct deleter {
  T* operator()(T* x) { delete x; return  0 ; }
};
game :: ~game()
{
 transform(p.begin(), p.end(), p.begin(), deleter<player>() );
}

void game :: add_machine_player(void)
{
 p.push_back(new machine_player()  );
}
мне это не слишком решение почему-то кажется не слишком хорошим. Главным образом метод add_machine_player .. Или я слишком подозрительно отношусь к коду? :-/ Хелп ми плиз
...
Рейтинг: 0 / 0
push_back(new ... )
    #32834501
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да вроде нормально.
моло ли чего захочешь добавит в этот метод...

а что за deleter? просто случайно в код попал или его присутствие необходимо для понимания нами ситуации?
...
Рейтинг: 0 / 0
push_back(new ... )
    #32834523
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, еще неплохо бы проверять, что оператор new вернул не NULL.
...
Рейтинг: 0 / 0
push_back(new ... )
    #32834650
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
roman10
В принципе, еще неплохо бы проверять, что оператор new вернул не NULL.

вы о чем, товарисч????
Это вам не Си. New если будут какие то закавыки - не вернет NULL, он просто сгенерит исключение.

Man555
имею некоторый опыт "общения" с современными движками-шутерами. Могу посоветовать две вещи:

1) Если ты будешь использовать клиент-серверную технологию, значит тебе придется между тачками рассылать snapshot-ы, и, кстати, обрабатывать их потери. так вот, snapshot это по сути пакет состояния игры(назовем это так). засунусть туда std::list тебе будет чертовски проблематично. Без преобразования в массив не обойтись. Поэтому рекомендую юзать std::vector. тем более вряд ли у вас игроков будет больше 1000. Кстати для этого дела во всех играх номаных есть параметр sv_max_clients (обычно колеблется в районе 32 или 64). Т.е. память для вектора можно будет резервировать заранее.

2) во избежании накладных расходов на удаление и вставку, у клиентов-игроков ставишь флажок active, вместо удаления просто сбрасывай этот флаг. Посик свободной позиции по 64 элементам массива отработает моментально. Кстати в кваковских двигах так и сделано.

3) я бы не стал сосздавать такой небезопасный тип хранящий ОБЫЧНЫЕ указатели, деструкторы по которым вызываются только в деструкторе контейнера. Лучше использовать для этого дела счетчик ссылок. Тогда другие ОПАСНЫЕ операции по контейнеру будут безопасны. даже те операции о которых не подозреваете. Для ваще случая я бы рекомендовал boost::shared_ptr - он все сделает в лучшем виде. Вам ничего не надо будет писать, только std::vector< shared_ptr<player> > саму библиотеку смотри на boost.org
...
Рейтинг: 0 / 0
push_back(new ... )
    #32834837
roman10
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто вам не Си. New если будут какие то закавыки - не вернет NULL, он просто сгенерит исключение
Согласен. Просто, в VC наблюдается баг . Не знаю, исправили его или нет.
...
Рейтинг: 0 / 0
push_back(new ... )
    #32835057
dwl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dwl
Гость
Ну может в MSVC 5 это и было я попробовал на своем NET 2003. Итак set_new_handler устанавливает, функцию которая вызывается если глобальный new вернул исключение. Пишем тест
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#include "stdafx.h"
#include <new>
#include <new.h>
#include <limits>

int my_new_handler(size_t) {
	throw std::bad_alloc();
	return  0 ;
}

int _tmain(int argc, _TCHAR* argv[])
{
	_PNH _old_new_handler;
	_old_new_handler = _set_new_handler(my_new_handler);
	
	int * arr = new int[ std::numeric_limits<int>::max() ];

	_set_new_handler(_old_new_handler);
	return  0 ;
}

пускаем. говорим отладчику замолчать и о чудо! bad_alloc вылетает!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / push_back(new ... )
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]