C ++:创建指针副本

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:

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

使用复制构造函数后,我仍然遇到棋盘数值更改的问题。它是否也需要一个复制构造函数?


5
你的复制构造函数很可能是浅复制了一个成员指针,而你又使用该指针进行比较。附带一提,那个本地指针必要吗?为什么不用GameMaster copy (*thisMaster);呢? - chris
1
发布您的GameMaster类的声明和复制构造函数的实现将非常有帮助。 - razlebe
@chris 抱歉,我对C++还不太熟悉。我不知道我需要制作一个复制构造函数,所以我想我正在使用默认的构造函数。我需要一个复制构造函数吗?另外,我创建了一个新的本地函数,因为之前我遇到了堆栈溢出的问题。 - user1599559
是的,如果你在类中有非平凡数据(如指针或指针集合)并且正在制作副本,那么你需要自己编写拷贝构造函数。 - Some programmer dude
@JoachimPileborg 我刚刚编辑了一下,加入了复制构造函数。但我仍然遇到了同样的问题。看起来还好吗?其中的对象(例如masterBoard)也需要复制构造函数吗? - user1599559
显示剩余6条评论
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
};

这里是一个有关于浅拷贝和深拷贝的链接:Shallow vs Deep copy


谢谢您的帮助,我现在正在学习深拷贝。我假设对于Board类,我需要提供一个复制赋值运算符,因为我使用了 =,是这样吗? - user1599559
不完全是,masterBoard的问题在于如果它包含指针的向量或者像GameMaster类那样的指针,那么你也应该为其编写拷贝构造函数。我假设你想要一个masterBoard类的深拷贝,如果不是这种情况,你可以简单地进行浅拷贝而不实现其拷贝构造函数。 - Seçkin Savaşçı

0

players=gm.players;

仅仅是复制指针的集合.. 你需要在新的向量中进行深层次拷贝玩家。

编辑

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

你还需要为玩家拥有一个常量副本。

祝福


我觉得可能是这样。很抱歉,我不熟悉深拷贝是什么。我该怎么做? - user1599559

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接