Я изучаю 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 Я создам новый вопрос для этого странного поведения.