2014-01-27 6 views
0

Я пишу карточную игру на C++. У меня есть игра , которая отслеживает игроков. У меня также есть абстрактный базовый класс игрок, из которого классы человек и компьютер происходит.Указатель на массив указателей (динамическое распределение)

Я хотел бы оставить игроков в массиве. Количество игроков неизвестно во время компиляции. Поскольку некоторые игроки - люди и другие компьютеры, мне нужен указатель игрока для каждого, хранящийся в массиве, который динамически распределяется, потому что количество игроков неизвестно, правильно?

Поскольку я относительно новичок в C++, я не мог понять, как синтаксис ищет такого рода вещи.

+1

Вы можете упростить эту проблему, используя вектор указателей на Player. – juanchopanza

+0

@juanchopanza Упростите его еще больше, используя вектор Игроков, а не указатели (cuz указатели в векторах - это дьявол). – IdeaHat

+3

@MadScienceDreams: Это будет * срезать * производные объекты. – Johnsyweb

ответ

2

Для динамического массива, стандартная библиотека обеспечивает std::vector.

Поскольку вам нужно сохранить указатели на абстрактный базовый тип, а не на сами объекты, вам нужно убедиться, что вы правильно управляете жизненными циклами объекта. Самый простой способ - хранить интеллектуальные указатели (в данном случае std::unique_ptr, для простого одиночного владения), так что объекты автоматически уничтожаются, когда они удаляются из вектора.

Так ваш массив будет выглядеть

// Declaration 
std::vector<std::unique_ptr<player>> players; 

// Adding players 
players.push_back(std::unique_ptr<person>(new person("Human"))); // C++11 
players.push_back(std::make_unique<computer>("CPU"));   // C++14 (hopefully) 

// Accessing players 
for (auto & player : players) { 
    player->play(); 
} 
+0

Когда вы получаете доступ, что означает «авто» и «&»? Кроме того, когда я пробую это в Xcode, он говорит, что мне нужно использовать '->' вместо '.' –

+0

'auto' означает« выяснить тип для меня »; вы могли бы написать 'player', если хотите. '&' означает "ссылка". Xcode прав: вам нужно '->', а не '.', чтобы разыграть умный указатель (я исправил свой ответ). –

1

вам нужно

std::vector<std::shared_ptr<Player>> players; 

, если вы хотите использовать стандартную библиотеку (которую вы должны)

иначе

Player** players; 
+2

Почему? Я ничего не вижу в сообщении OP, чтобы оправдать это. – juanchopanza

+0

'Player ** players' не является массивом. – Johnsyweb

+0

:) @Johnsyweb.строго говоря, он попросил указатель на массив, а не на массив. Поэтому вы говорите: «Игрок * не является массивом». Мы с тобой знаем, что за этим утверждением - он этого не делает, поэтому не путайте его, учитывая, что Player * и Player [] будут работать нормально – pm100

0

Вы можете объявить переменную указатель, используя в качестве следующего

Player *playerptr; 

Это означает, что playerptr является указатель на тип player.It может держать адрес как игрок, так и массив игроков. В C++ и C массив реализуется как указатель на первый элемент массива.

И согласно вашему требованию вы можете распределить массив динамически.

playerptr=new Player[20]; 

Здесь 20 - размер массива.

playerptr=new Player[20](); 

Второй синтаксис инициализирует все элементы в массиве значением по умолчанию.

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