【问题标题】:C++ Copying PointersC++ 复制指针
【发布时间】:2011-05-11 04:09:21
【问题描述】:

您好,我想知道如何将 C++ 中的二维数组指针的内容复制到另一个位置并设置另一个指向它的指针,这样当我对复制的指针进行更改时,原始数据不会发生任何变化?

基本上它是一个指向棋盘上棋子的数组指针。所以它就像Piece * oldpointer = board[8][8]。现在我想复制这个指针中的所有内容,包括像 getvalue(), getcolor() 这样在 Pieces 头文件中的方法到另一个位置并设置一个指向它的指针,这样我就可以在那里进行操作并测试它而不必影响这个原始文件数据?我在某处读到我不得不使用allocate() 但我不确定。请帮忙

【问题讨论】:

  • 正在讨论解决方案here,查看“转化次数”下(大约 3 页以下)。

标签: c++ arrays pointers chess


【解决方案1】:

在 C++ 中,您可以如下定义二维数组类型(您需要现代 C++ 编译器):

#include <array>
typedef std::array<std::array<Piece, 8>, 8> board_t;

如果您的编译器不支持std::array,您可以改用boost::array

#include <boost/array.hpp>
typedef boost::array<boost::array<Piece, 8>, 8> board_t;

现在你可以使用上面的类型了。如我所见,您需要复制指针指向的对象:

board_t* oldpointer = new board_t;

// do some with oldpointer

// now make a copy of the instance of the object oldpointer points to
// using copy-constructor
board_t* newpointer = new board_t( *oldpointer );
// now newpointer points to the newly created independent copy

// do more

// clean up
delete oldpointer;

// do more with newpointer

// clean up
delete newpointer;

【讨论】:

  • 还有std::vector,到处都支持。
  • std::vector 动态分配内存。据我所知,在国际象棋中棋盘的大小是固定的,所以std::vector 不需要。
  • 你是对的,但鉴于 OP 显然是新手,将他指向高级或新引入的库,如 Boost 或 TR1 可能不是他学习的最佳方式。我怀疑一个向量对于他的目的来说已经绰绰有余了,而且它有很好的记录并且随处可用。
【解决方案2】:

既然您使用的是 C++,为什么不为您的 Piece 类定义一个复制构造函数呢?那么就

Piece copied_piece(*board[8][8]);

如果你的类是 POD,你甚至应该可以使用默认的复制构造函数。

【讨论】:

  • 虽然棋盘是他想要复制的... 8-) 假设你有一个棋盘类有 8x8 棋子,那么你可以这样做: Board a; ... 委员会 b(a);数组应隐藏在板内,所有访问都使用 Piece get(int x, int y);.
【解决方案3】:

你可以通过在目的地分配内存然后memcopy来复制

dest_pointer = (<<my type>>*) malloc(sizeof(<<my type>>);
memcpy(dest_pointer, src_pointer, sizeof(<<my type>>);

顺便说一句,这些方法永远不会被复制。它们不属于一个对象。

【讨论】:

  • 别忘了包含
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
相关资源
最近更新 更多