在另一个类上使用的单例模式

时间:2013-11-01 14:57:55

标签: c++ singleton

所以我试图实现一个有记分牌和两个玩家的程序,我试图让两个玩家使用单身模式共享记分牌。但是,当我尝试在播放器类中定义的全局记分板上使用方法时,我总是会收到“运行失败”消息。

这是我的两个头文件,如果有必要,我可以提供完整的实现。

#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方法一起

2 个答案:

答案 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)