所以我试图实现一个有记分牌和两个玩家的程序,我试图让两个玩家使用单身模式共享记分牌。但是,当我尝试在播放器类中定义的全局记分板上使用方法时,我总是会收到“运行失败”消息。
这是我的两个头文件,如果有必要,我可以提供完整的实现。
#ifndef PLAYER_H
#define PLAYER_H
#include "scoreboard.h"
#include <string>
#include <fstream>
class Player{
private:
std::ifstream file1;
std::ifstream file2;
static Scoreboard* _game;
public:
static Scoreboard* Game();
void makeMove(const char,const std::string);
};
#endif
#ifndef SCOREBOARD_H
#define SCOREBOARD_H
class Scoreboard{
private:
int aWin;
int bWin;
int LIMIT;
int curCounter;
public:
void resetWins();
void addWin(char);
void makeMove(const int, char);
void startGame(const int, const int);
int getWin(char);
int getTotal();
int getLimit();
};
#endif /* SCOREBOARD_H */
在player.cc中
Scoreboard* Player::_game = 0;
Scoreboard* Player::Game(){
if (_game = 0)
{
_game = new Scoreboard;
_game->resetWins();
}
return _game;
}
与makeMove方法一起
答案 0 :(得分:1)
您的Scoreboard
实例不需要是指针:
static Scoreboard _game;
// ...
static Scoreboard& Game() { return _game; }
或者,只需省略_game
的类声明:
// you can either make this function static or non-static
Scoreboard& Game()
{
static Scoreboard game; // but this variable MUST be static
return game;
}
如果没有内存管理问题,那将会做同样的事情。
这将为所有Scoreboard
创建Players
的单个实例。如果您只想拥有Scoreboard
的单个实例(例如,如果您有一个Referees
课程也需要查看记分板),您可以修改您的记分牌类:
class Scoreboard
{
private:
// all your data members
Scoreboard() {} // your default constructor - note that it is private!
public:
// other methods
Scoreboard& getInstance()
{
static Scoreboard instance;
return instance;
}
};
然后,要在其他类中访问它,您将包含记分板标题并将其用作:
#include "Scoreboard.h"
void my_func()
{
Scoreboard& scoreboard = Scoreboard::getInstance();
scoreboard.DoSomething();
}
答案 1 :(得分:0)
在Player::Game
中,您已写过
if (_game = 0)
即设置_game = 0
并评估为false,以便您实际上不创建记分板。将其更改为:
if (_game == 0)