2011-07-17 4 views
0

Я пытался выяснить, как решить эту проблему с сегрегацией в течение нескольких часов.C++ Вектор указателей, слишком много проходов?

У меня есть карточная игра на C++, четыре игрока. Игрок (базовый класс) может быть либо компьютером, либо человеком (производные классы). Чтобы сохранить их, у меня есть еще один класс под названием playerContainer, который имеет свои собственные функции и использует частный вектор-член указателей игроков.

std::vector<Player*> players_; 

При добавлении нового игрока к вектору, я сделать что-то вроде этого:

Human *newPlayer = new Human(); 
container.add(newPlayer); 

Где добавить это:

void playerContainer::add(Player* newPlayer) { 
    players_.push_back(newPlayer); 
} 

И тогда я один класс называется GameLogic который имеет личный член playerContainer и выполняет инициализацию игрока (среди нескольких других вещей).

Тем не менее, я получаю seg-ошибки после попытки включить его в реализацию MVC.

В графическом интерфейсе вы нажмете кнопку, чтобы начать игру. Кнопка вызывает функцию startGame окна, которая собирает параметры, а затем вызывает его startGame класса private member Model, который затем вызывает функцию initializePlayer его private member gameLogic, которая затем вызывает функцию добавления его private member playerContainer. В этот момент программа сломается.

В ходе небольшого тестирования я обнаружил, что он не будет неисправен, если я сохраню шаг. Например, если я дал объекту window объект gameLogic, а затем вызвал его функцию initializePlayer и т. Д., Программа будет работать нормально без ошибок.

Я уверен, что есть лучшее решение, чем объединить классы Model и gameLogic, поскольку они уже довольно раздуты. Может ли кто-нибудь дать представление?

Кроме того, если это немного запутывает, пожалуйста, попросите меня уточнить. Я сделал все возможное, чтобы четко объяснить, но с таким количеством различных классов, это становится трудно сделать.

РЕДАКТИРОВАТЬ: Невозможно попробовать заменить Player * с помощью int, для меня слишком большой код, чтобы сделать это в любой момент.

Я попробовал valgrind, но журнал был огромным и вообще бесполезным. Или, по крайней мере, я не мог понять многое из этого. Для тех, кто хочет взглянуть, вот ссылка на scribd: http://www.scribd.com/doc/60210916/Memory-Leak

Ошибка выделения seg возникает при добавлении функции playerContainer на линии push_back.

я попробовать свои силы в отладчике ...

+0

Что произойдет, если вы не используете Player * в своем векторе, а просто используйте int вместо. Комментируя любой код, который использует прямое и запущенное Player *, покажет вам, используете ли вы неинициализированного игрока или проблема находится где-то в другом месте. –

+1

Если вы находитесь на поддерживаемой платформе, запустите свою программу через 'valgrind'. –

+0

, пожалуйста, покажите еще код. например как вы используете добавленных игроков в своей реализации. Как вы освобождаете указатели и т. Д. ... –

ответ

0

Вы уверены, что ваша модель, где-то, но до initializePlayer называется, на самом деле выделяет playerContainer?

+0

Нет, я не могу сказать, что я полностью уверен. Однако по какой-либо причине использование точного синтаксиса добавления объекта gameLogic в окно оставляет все в порядке. Я не понимаю разницы между тем, как я это делаю с окном и как я это делаю с моделью. – SpeedBurner

+0

Трудно сказать без кода. Как вы объявляете и размещаете playerContainer, и как вы к нему обращаетесь? –

+0

playerContainer использует неявный конструктор и имеет только один закрытый член 'std :: vector players_'. Доступ к своим членам осуществляется с помощью перегруженного оператора [], который возвращает players_ [i]. Создание самого игрокаКонтейнер выполняется только как частный член gameLogic, который выполняет почти следующее: 'class gameLogic { private: private: playerContainer container; } ' – SpeedBurner

Смежные вопросы