【问题标题】:object empty inside calling function using pointer as argument使用指针作为参数的调用函数内部的对象为空
【发布时间】:2019-06-05 09:14:37
【问题描述】:

我正在用指针学习 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;
    }
}

我希望能够通过传递一个指针来访问在 savePlayer 方法内的 createPlayer 方法中创建的对象,但我只是得到一个空字符串

playerPtr->getName()

我不明白在方法调用之前和之后如何访问对象,但由于地址仍然有效,所以不能在内部访问。

EDIT1 感谢您引导我发现明显的错误! 由于 code:blocks 的反复崩溃,我的 getName() 方法在我保存它之前就被删除了,我没有考虑检查它。通过编写以下 getName() 它起作用了:

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

尽管 getName() 方法为空,但我不明白为什么以及如何在 createPlayer() 中获得输出。这正常吗?

编辑 2 我将为这种奇怪的行为创建一个新问题。

【问题讨论】:

  • 请发布你的getter函数getName()
  • 无法通过在函数周围添加正确代码来重现。错误来自未显示的代码。如果您需要帮助,请提供minimal reproducible example

标签: c++ object pointers


【解决方案1】:

您拥有的代码应该可以正常工作。我唯一的猜测是你的 getter 函数getName() 有问题。

我想你有这样的想法?

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

在线代码示例:https://rextester.com/INHG32142

【讨论】:

  • 有趣。我的返回方法如下:std::string Player::getName() const { return m_name; } 然而我的代码:块每天都在 ubuntu 上窃听,并且该方法被删除了。这就是错误的来源。我的 getName 实际上是空的。但是为什么它在方法 createPlayer 中返回了一些东西,尽管 getName() 是空的?
  • @Shaker81:getter 函数应返回成员的 const &amp;,并且该函数应标记为 const。您的 getter 函数返回一个副本。在某些情况下这可能会出现问题,但在这段代码中是可以的。如果您的函数被删除,那么代码甚至不应该编译。但是,如果您使用的是 IDE,那么有时影子构建会保留您的函数的引用,并在它应该失败时工作。我真的不知道你的情况可能出了什么问题,但这是我的猜测。
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多