3

GameMaster* thisMaster「クリーンな」コピーを維持しながら操作を実行できるように、のコピーを作成する必要があります。ただ、今のやり方は、 に変更を加えるとcopy、それも変わりthisMasterます。

void Move::possibleMoves(GameMaster* thisMaster)
{
     GameMaster* copy = new GameMaster(*thisMaster);
}

どうすればこれを修正できますか?

編集: コピー コンストラクターを作成しましたが、まだ同じ問題が発生しています。

GameMaster::GameMaster(const GameMaster& gm)
{
    for(int i=0;i<GAMETILES;i++)
    {
        gameTiles[i]=gm.gameTiles[i];
    }
    players=gm.players;
    vertLines=gm.vertLines;
    horLines=gm.horLines;
    turn = gm.turn;
    masterBoard=gm.masterBoard;
    lastLegal=gm.lastLegal;
    lastScore=gm.lastScore;
}

GameMaster の完全なクラス定義は次のとおりです。

Class GameMaster
{
public:
    GameMaster(void);
    GameMaster(const GameMaster& gm);
    ~GameMaster(void);
    //functions

private:
    std::vector <Player*> players;
    std::vector <Line> vertLines;
    std::vector <Line> horLines;
    Tile gameTiles [GAMETILES];
    std::vector <std::string>colors;
    std::vector <std::string>shapes;
    int turn;
    Board masterBoard;
    bool lastLegal;
    int lastScore;
};

コピー コンストラクターを使用すると、ボードが値を変更するという問題が発生します。コピーコンストラクターも必要ですか?

4

2 に答える 2

2
Class GameMaster
{
public:
    GameMaster(void);
    GameMaster(const GameMaster& gm);
    ~GameMaster(void);
    //functions

private:
    std::vector <Player*> players; // You should make a deep copy because of pointers
    std::vector <Line> vertLines; // Shallow copy is OK if Line doesn't have pointers in it
    std::vector <Line> horLines; // see above
    Tile gameTiles [GAMETILES]; // One by one assignment is OK
    std::vector <std::string>colors; // Shallow copy is OK
    std::vector <std::string>shapes; // Shallow copy is OK
    int turn; // assignment is OK
    Board masterBoard; // same questions for GameMaster still exists for copying this
    bool lastLegal; // assignment is OK
    int lastScore; // assignment is OK
};

浅いコピーと深いコピーのリンクは次のとおりです

于 2012-08-24T06:44:22.223 に答える
0

プレーヤー=gm.players;

ポインターのコレクションをコピーするだけです..新しいベクターでプレーヤーのディープコピーを行う必要があります。

編集

for( auto iter = gm.players.begin(); iter != gm.players.end(); ++iter) 
{
   players.push_back(new Players(*iter))
}

Player の copy const も必要です。

乾杯

于 2012-08-24T06:41:15.443 に答える