Я пытался выяснить, как решить эту проблему с сегрегацией в течение нескольких часов.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.
я попробовать свои силы в отладчике ...
Что произойдет, если вы не используете Player * в своем векторе, а просто используйте int вместо. Комментируя любой код, который использует прямое и запущенное Player *, покажет вам, используете ли вы неинициализированного игрока или проблема находится где-то в другом месте. –
Если вы находитесь на поддерживаемой платформе, запустите свою программу через 'valgrind'. –
, пожалуйста, покажите еще код. например как вы используете добавленных игроков в своей реализации. Как вы освобождаете указатели и т. Д. ... –