Почему указатель не сохраняет и не печатает те же данные, что и объект, которому он должен соответствовать? (C ++) - PullRequest
1 голос
/ 09 мая 2020

Я делаю игру, в которой пользователю разрешено выбирать объект Player из вектора Player объектов, считанных из текстового файла.

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

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

Однако указатель player1 не печатает правильное имя за пределами for l oop после того, как он нашел совпадение. Вместо этого указатель по умолчанию выводит на печать имя последнего игрока в текстовом файле каждый раз , а не имя игрока, которое соответствует вводу пользователя.

Что я мог сделать с исправить эту проблему?

Пример содержимого текстового файла:

Dave 
Jill 
Bob 
Mary 
Donna
Ryan

Ответы [ 2 ]

1 голос
/ 09 мая 2020
for(Player p:playerVectorReadIn){

Это итерация по значению, p - это объект, локальный в области видимости для этого for l oop, и является копией объекта в векторе. Каждый раз, когда эта l oop повторяется, этот объект уничтожается. Если l oop повторяется снова, создается новый объект p.

     player1=&p;

Это сохраняет указатель на этот локальный объект. Однако, как мы только что обнаружили, p уничтожается в конце l oop, player1 становится висячим указателем на уничтоженный объект, и его использование впоследствии становится неопределенным поведением.

Это объясняет наблюдаемые вами нежелательные результаты. К счастью, решение очень простое, выполняйте итерацию по ссылке:

for(Player &p:playerVectorReadIn){

p теперь является ссылкой на фактический объект в векторе, и пока сам вектор не перераспределяется впоследствии, указатель на объект в векторе останется действительным.

0 голосов
/ 09 мая 2020

В этом l oop:

for(Player p : playerVectorReadIn){
        if(p.getName()==name){
            player1=&p; //setting pointer to player 

вы делаете копию из Player, а затем берете его адрес. Копия будет d ie в конце l oop, и у вас останется свисающий указатель.

Вам нужно перебрать вектор по ссылке:

for(Player & p:playerVectorReadIn){
        if(p.getName()==name){
            player1=&p; //setting pointer to player (correctly)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...