2013-02-19 90 views
0

我想制作一个棋盘游戏,因为每一步都必须是有效的,所以我正在制作一个电路板副本并进行移动,以便我可以验证该移动是否有效。制作电路板副本

首先我初始化所有位置上的板为0(迭代通过板,并设置每P 0

pair<int, int> p(y, x); 
board_[p] = 0; 

这是抄板方法

void Board::copy(Board & gb) { 
for (int y = MIN_Y; y <= MAX_Y; ++y) { 
    for (int x = MIN_X; x <= MAX_X; ++x) { 
     pair<int, int> p(y, x); 
     if (gb.board_.at(p) != 0) { 
      board_[p] = new Pieces(*gb.board_.at(p)); // **where I am confused** 
     } else { 
      board_[p] = 0; 
     } 
    } 
} 
} 

我集装箱板是:

map<pair<int,int>, Pieces*> board_; 

现在在一个平面Ÿ方法,我做董事会的副本

unsigned int play(Board & b){ 
    b.copy(*this); 
} 

我的问题:既

board_[p] = new Pieces(*gb.board_.at(p)); //Pieces is a class I defined 

board_[p] = gb.board_.at(p); 

编译没有任何错误或警告。我应该使用哪一个?

回答

1

两者都可能是正确的,但您可能需要第一个。第一个将复制Pieces到新板 - 这被称为深层复制。第二个将只复制指向每个Pieces的指针,所以两个板指向同一组Pieces - 这是一个浅拷贝。

但是,这里有一个更大的问题。你正在定义一个copy函数,但是C++为我们提供了一个语言功能 - 复制构造函数。而应该定义一个函数,像这样:

Board::Board(const Board& other_board) { 
    // Copy everything from other_board to this board 
} 

而且你会使用它,像这样:

Board board; 
Board newBoard(b); 
+0

其实我有:Board :: Board(board& } – HoKy22 2013-02-19 22:52:58

+0

它本质上是一个拷贝构造函数吗? – HoKy22 2013-02-19 22:53:20

+0

@ HoKy22它应该把'const Board&'作为一个拷贝构造函数。 – 2013-02-19 23:05:24

0

那么,board_ [p]可以是指向Pieces的指针?

然后第一个是正确的。第二个是件ID号码(不是我真正打算分配的指针,根据我的理解)。

1

这是一个副本:

board_[p] = gb.board_.at(p); 

这是一个副本:

board_[p] = new Pieces(*gb.board_.at(p)); 

第一个唯一拷贝的指针,所以改变到一块在board_将导致gb.board_中的相同作品发生更改。第二个实际上复制数据,所以更改是孤立的。

要使用哪个取决于您的应用程序。如果你想要更改传播,那么浅拷贝。否则,您需要深层复制。

值得注意的是,您的代码片段使您看起来像是处于严重内存泄漏的风险之中。您正在创建new件,但从来没有delete-它们。

0

由于您不想修改原件,因此需要进行深层复印。第二个是浅拷贝。所以你需要第一个。

0

首先会做一个深拷贝,即复制对象(克隆它们),而第二会做一个浅拷贝,即将指针复制到对象。在后一种情况下,您必须在板上引用Piece对象的相同实例。问题在于如果其中一块板子删除了这些棋子,另一块会指向悬停的记忆。 (gb);