& quot; Нарушение прав чтения: это был nullptr & quot; Думал, что назначил правильно …?

У меня есть класс игрока, который содержит имя игрока, правильные ответы и неправильные ответы, полученные игроком. Когда я пытаюсь получить доступ к функциям 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);
}

Нужно ли устанавливать класс по-разному при работе с указателями, чтобы избежать этих нарушений доступа? Спасибо!

1

Решение

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

Это только меняет локальную копию плеера. Чтобы изменить указатель вне функции, вам нужно взять ссылку на указатель (или двойной указатель). Использование:

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

вместо.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]