1. ホーム
  2. c++

[解決済み] "Read Access Violation: This was nullptr" 正しく割り当てたはずなのに......?

2022-02-15 23:14:42

質問

プレイヤーの名前、正解、不正解を保持するプレイヤークラスを持っています。getRight()、getWrong()、addToRight()、addToWrong()関数にアクセスしようとすると、これらの関数内の文で「読み取りアクセス違反:これはnullptr"でした」というエラーが発生しました。ポインタが正しく設定されていないのでしょうか?どのような変更を加えればよいのでしょうか?ありがとうございます。

以下は、Player.h ファイルです。

#ifndef PLAYER_H
#define PLAYER_H
#pragma once

using namespace std;
class Player;//FWD declaration

class Player
{
public:
    Player();
    Player(string playerName);

    string getName() const
    {
        return name;
    }

    //These functions show stats from
    //current round
    int getRight() const
    {
        return right;
    }

    int getWrong() const
    {
        return wrong;
    }

   //These functions update
   //player info that will be saved
   //to player profile
   void setName(string userName);
   void addToRight();
   void addToWrong();

private:
     string name;
     int right;
     int wrong;
};
#endif

以下は、Player.cppファイルです。

#include <iostream>
#include <iomanip>
#include <fstream>
#include "Player.h"

using namespace std;

Player::Player()
{
    name = "";
    right = 0;
    wrong = 0;
}

Player::Player(string playerName)
{
    ifstream inFile;
    ofstream outFile;
    string name = playerName;
    string fileName = playerName + ".txt";

    inFile.open(fileName.c_str());
    if (inFile.fail())
    {
        outFile.open(fileName.c_str());
        outFile << 0 << endl;
        outFile << 0 << endl;
        outFile.close();
        inFile.close();
        setName(playerName);
        right = 0;
        wrong = 0;

        cout << "Welcome new player!"
            << " Your statistics profile has been created." << endl;
    }
    else
    {
        inFile >> right;
        inFile >> wrong;
        inFile.close();
        setName(playerName);
        cout << "Welcome back!" << endl;
    }
}

void Player::setName(string userName)
{
    name = userName;
}

void Player::addToRight()
{
    right = right + 1;
}

void Player::addToWrong()
{
    wrong = wrong + 1;
}

そして、これが私のメインです。

#include <iostream>
#include <string>
#include "Player.h"

using namespace std;

void test(Player *player);

int main()
{
    Player *player = nullptr;


    test(player);

    cout << "name: " << player->getName() << endl;
    cout << "right: " << player->getRight() << endl;

    player->addToRight();

    cout << "right: " << player->getRight() << endl;

    return 0;
}

void test(Player *player)
{
    string name;

    cout << "name: ";
    getline(cin, name);
    player = new Player(name);
}

ポインタを扱う場合、これらのアクセス違反を回避するために、クラスは別の方法で設定する必要があるのでしょうか?ありがとうございます。

どのように解決するのですか?

void test(Player *player) {
    ...
    player = new Player(...);
}

これは player のローカル コピーを変更するだけです。 関数外でポインタを変更するには、ポインタへの参照(またはダブルポインタ)を取得する必要があります。 使用してください。

void test(Player *& player) {...}

の代わりに