Я пишу карточную игру на C ++. у меня есть игра класс, который отслеживает игроков. У меня также есть абстрактный базовый класс игрок, из которого уроки человек а также компьютер происходит.
Я хотел бы держать игроков в массиве. Количество игроков неизвестно во время компиляции. Поскольку некоторые игроки — это люди и другие компьютеры, мне нужен указатель игрока для каждого из них, который хранится в массиве, который распределяется динамически, поскольку число игроков неизвестно, верно?
Поскольку я относительно новичок в C ++, я не мог понять, как выглядит синтаксис для такого рода вещей.
Для динамического массива стандартная библиотека обеспечивает 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();
}
тебе нужно
std::vector<std::shared_ptr<Player>> players;
если вы хотите использовать стандартную библиотеку (что вы должны)
иначе
Player** players;
Вы можете объявить переменную указателя используя следующее
Player *playerptr;
Это означает, что playerptr является указателем на тип Player. Он может содержать адрес Player, а также массив Players. В C ++ и C массив реализован как указатель на первый элемент массива.
А согласно вашему требованию вы можете динамически распределять массив.
playerptr=new Player[20];
Здесь 20 — размер массива.
playerptr=new Player[20]();
Второй синтаксис инициализирует все элементы в массиве к их значению по умолчанию.