“Violation d'Accès en lecture: C'était nullptr”, Pensais-je attribué correctement...?

J'ai un Joueur de Classe qui détient le nom du joueur, de bonnes réponses,et de mauvaises réponses, le joueur est arrivé. Lorsque j'essaie d'accéder à getRight(), getWrong(), addToRight(), ou addToWrong fonctions() j'obtiens un message d'erreur qui dit: "violation d'accès en Lecture: c'était nullptr" au les instructions à l'intérieur de ces fonctions. Je ne dois pas être la configuration de mon pointeur correctement. Quels changements dois-je faire? Merci!

Voici le Joueur.h fichier

#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

Ici est la Player.cpp fichier:

#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;
}

Et voici ma principale:

#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);
}

Une classe doivent être configurés différemment lorsqu'ils traitent avec des pointeurs pour éviter ces violations d'accès? Merci!

  • éviter d'écrire using namespace std .
  • sauf dans les exemples que vous postez sur un débordement de pile.. alors c'est la fin. Aussi, si vous ne le mettez dans .fichiers cpp, il n'est pas aussi mauvais, juste ne jamais mettre l' .h fichier de code réel.
  • Quelle est la raison de l'utilisation du pointeur? Tu as tout écrit, puis pour une raison quelconque introduit un Player * dans votre programme. Pourquoi?
  • pourquoi il ne faut jamais mettre dans .h fichier de code réel? Quel est le problème avec elle ?
  • Parce qu'il infecte tous les autres .h fichiers #include après -- y compris des choses qui incluent votre .h de fichier et puis d'autres choses. Les espaces de noms éviter les conflits de noms, mais si vous forcez votre "aide" directive sur un tiers de la bibliothèque, il peut alors avoir des conflits et de cesser de compiler en raison de symboles ambigus (en std:: et dans cette bibliothèque) - en bref, de s'habituer à taper std:: il n'est pas difficile.
  • Je vais regarder à ça. Merci. La classe je suis, mon professeur, et le livre nous sommes à la lecture de tous les programmes définis de cette manière. Je peux certainement éloignez-vous de cette pratique.