У меня есть вопрос относительно классов и того, как можно обновить их участников.
Итак, у меня есть простой класс
class Player
{
public:
Player();
std::vector <std::string> hand = {"r4", "r1", "g5"};
};
Player::Player()
{
}
и я добавил экземпляры этих классов в другой вектор
std::vector <Player> players;
Player p1;
Player p2;
players.push_back(p1);
players.push_back(p2);
Но затем я пытаюсь обновить векторы инициализированных классов внутри вектора, хранящего классы
//doesn't work
//p1.hand.push_back("test1");
//p2.hand.push_back("test2");
//works
players[0].hand.push_back("test1");
players[1].hand.push_back("test2");
for (int i = 0; i < 2; i++)
std::cout << players[i].hand[(players[i].hand.size() - 1)] << std::endl;
Я не понимаю, почему он не добавляет тестовые строки к векторам классов в массиве игроков с помощью первого метода. Это потому, что это не тот экземпляр класса, который я впервые инициализировал? Если бы кто-то мог прояснить это для меня, это было бы очень признательно. Спасибо!
Хорошо, это имеет смысл, спасибо. Но из любопытства, могу ли я поместить оригинал в вектор?
Измените свой способ написания кода при работе с C++. C++ — это не Java или JavaScript. Какова веская причина иметь оригинальные экземпляры? Если они есть в векторе, локальные версии все равно выйдут за рамки.
@tothemax, есть несколько способов сделать это.
std::vector<std::reference_wrapper<Player>>
будет "самым чистым", но вектор ссылок, не являющихся владельцами, редко бывает правильным.@PaulMcKenzie Да, ха-ха, на самом деле я использую только JavaScript, поэтому я пытаюсь понять, как это работает на C ++. Есть ли у вас какие-либо рекомендации книг или ресурсов, которые могли бы облегчить этот переход?
@tothemax Вы можете начать здесь: coderhelper.com/questions/388242/…
Я думаю, что нужно думать о ссылках, а не о значениях. С++ работает по-другому в этом отношении. Локальные версии выйдут за пределы области действия и будут уничтожены — копии в векторе останутся на месте (до тех пор, пока сам вектор не выйдет за пределы области действия). Кроме того, в C++ есть семантика перемещения, поэтому вполне возможно, что любые опасения по поводу эффективности, когда речь идет о времени, будут спорными.
Да, я думаю, что постепенно начинаю обдумывать это, когда изучаю С++. Я буду помнить об этом, когда буду пытаться перенастроить свой мозг на этот язык.