使用指针作为参数的调用函数中的对象为空

时间:2019-06-05 09:14:37

标签: c++ object pointers

我正在用指针学习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 谢谢您指导我犯下明显的错误! 由于recode:blocks崩溃的缘故,我的getName()方法在保存之前就被删除了,因此我没有考虑对其进行检查。通过编写以下getName()可以起作用:

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

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

编辑2 我将针对这种奇怪的行为提出一个新问题。

1 个答案:

答案 0 :(得分:0)

您拥有的代码应该可以正常工作。我唯一的猜测是您的getter函数public void intervalRecorder(long addOfThree){ g=1; k=1; testPath=UUID.randomUUID().toString() + "Custom_audio_record.3gp"; pathSave = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/Recorder Application/" +testPath; setupMediaRecorder(); try { mIntervalRecorder.setEnabled(false); mStopRecordBtn.setEnabled(false); mRecordBtn.setEnabled(false); mediaRecorder.prepare(); mediaRecorder.start(); } catch (IOException e) { e.printStackTrace(); } Toast.makeText(RecordActivity.this,"Recording...",Toast.LENGTH_SHORT).show(); new Handler().postDelayed(new Runnable() { @Override public void run() { try{ PackageManager p = getPackageManager(); ComponentName componentName = new ComponentName(RecordActivity.this, MainActivity.class); p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); }catch (Exception ex){ ex.printStackTrace(); } mediaRecorder.stop(); uploadAudio12(); Toast.makeText(RecordActivity.this,"Stop...",Toast.LENGTH_SHORT).show(); k=0; g=0; mIntervalRecorder.setEnabled(true); mStopRecordBtn.setEnabled(true); mRecordBtn.setEnabled(true); } },addOfThree); } 有点麻烦。

我认为您有类似的想法吗?

getName()

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