пустой объект внутри вызывающей функции с использованием указателя в качестве аргумента - PullRequest
0 голосов
/ 05 июня 2019

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

Я искал похожие проблемы в Интернете, но ничего не нашеланалогичный.Возможно, я не ищу правильные ключевые слова, так как понятия не имею, откуда это взялось.Я проверил перед вызовом функции, и указатель работает, и я могу получить доступ к объекту.Внутри вызывающей функции указатель все еще имеет правильный адрес, но я не могу получить доступ к объекту.Ничего не возвращается.После вызова функции указатель остается в силе и объект доступен.(см. // Комментарии в коде ниже)

Вот мои две функции внутри моего класса PlayerManager.

void PlayerManager::createPlayer()
{
    Player *playerPtr = new Player();
    std::string name;
    std::cout << "Name: ";
    std::cin >> name;                // I entered for instance John
    std::cout << std::endl;
    playerPtr->setName(name);
    std::cout << "PlayerPtr name before savePlayer: " << playerPtr->getName() << std::endl; // Outputs John
    std::cout << "playerPtr before savePlayer: " << playerPtr << std::endl;  // Ouputs the address
    this->savePlayer(playerPtr);
    std::cout << "PlayerPtr name after savePlayer but inside createPlayer: " << playerPtr->getName() << std::endl; // Outputs: John
    delete playerPtr;
}

void PlayerManager::savePlayer(Player* playerPtr) // the called method
{
    std::cout << "playerPtr inside savePlayer: " << playerPtr << std::endl;  // Outputs the address
    std::cout << "PlayerPtr name inside savePlayer: " << playerPtr->getName() << std::endl; // Outputs nothing
    std::string const fileName = "Players/"+playerPtr->getName()+".txt";
    std::cout << fileName << std::endl; // Outputs Players/.txt
    std::ofstream myFile = std::ofstream(fileName.c_str());
    if(myFile)
    {
        std::cout << "Enregistrement du nouveau joueur." << std::endl; // The code launches but no file is created.
        myFile << "{"<< std::endl;
        myFile << "name: " + playerPtr->getName() <<std::endl;
    } else {
        std::cout << "Erreur d'enregistrement du fichier." << std::endl;
    }
}

Я хотел бы иметь возможность доступа к объекту, созданному в методе createPlayer внутриметод savePlayer, передав указатель, но я просто получаю пустую строку для

playerPtr->getName()

Я не понимаю, как объект доступен до вызова метода и после, но не внутри, так как адрес все ещедействительный.

РЕДАКТИРОВАТЬ1 Спасибо, что подсказали мне очевидную ошибку!Из-за повторяющегося сбоя кода: блоков мой метод getName () был удален до того, как я смог сохранить его, и я не думал о его проверке.Написав следующий метод getName (), он сработал:

std::string Player::getName() const 
{
   return m_name; 
}

Пока я не понимаю, почему и как я получил вывод в createPlayer (), хотя метод getName () был пустым.Это нормально?

РЕДАКТИРОВАТЬ 2 Я создам новый вопрос для этого странного поведения.

1 Ответ

0 голосов
/ 05 июня 2019

Код у вас должен работать нормально.Мое единственное предположение - что-то подозрительное в вашей функции получения getName().

Полагаю, у вас есть что-то подобное?

const std::string &getName() const
{
    return name;
}

Пример кода онлайн: https://rextester.com/INHG32142

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...