我是C++新手,我正在通过C++项目移植到C++。
考虑以下Java代码,其中部件是表示国际象棋的类:
Piece[][] myPieces = new Piece[8][8];它创建一个数组,其中所有条目都为空。
我如何在C++中实现同样的目标?我试过:
Piece* myPieces = new Piece[8][8];但是这将创建一个数组,其中包含使用默认构造函数初始化的所有条目。
谢谢
编辑:,我希望C++代码高效/优雅,我不关心也不想将粘贴从C++复制到C++。如果需要,我很乐意对代码结构进行大量修改。
编辑2:的代码是用于国际象棋程序的,数组的大小将永远不会改变,性能是至关重要的。
发布于 2014-09-24 11:35:18
答案取决于,因为与Java相反,在C++中,您有不同的所有权语义和对象生命周期管理(这两者是同时进行的)。
如果您想要对类似于java的对象建模,您可以编写:
using PiecePtr = std::shared_ptr<Piece>;
std::array<std::array<PiecePtr, 8>, 8> Pieces;shared_ptr具有类似于java对象的语义(只要有对它的引用,就可以在任何地方传递它,并且保证它的生存期)。
如果要对观察到的对象建模(即数组不拥有它们),则应该编写:
using PiecePtr = Piece*;
std::array<std::array<PiecePtr, 8>, 8> Pieces;这确保了当Pieces对象被销毁时,实际的碎片本身仍保留在内存中。
如果要对Pieces数组所拥有的唯一对象进行建模,则应使用:
using PiecePtr = std::unique_ptr<Piece>;
std::array<std::array<PiecePtr, 8>, 8> Pieces;这确保了当碎片对象被销毁时,实际的碎片本身也会被销毁。
发布于 2014-09-24 11:36:42
在C++中声明一个8x8可选对象数组的最简单方法如下:
boost::optional<Piece> myPieces[8][8];boost::optional类型表示一个可选对象(如您在Java中的可空引用),它没有使用指针类型的所有缺陷。它将在未来几年作为标准库的一部分提供。
您可能更喜欢使用std::array类型,它是对固定大小数组的封装,它允许将它们视为一流的公民,并提供更好的接口:
std::array<std::array<boost::optional<Piece>, 8>, 8> myPieces;如果希望能够在运行时调整数组的大小,请考虑使用std::vector。
发布于 2014-09-24 11:44:50
由于您希望它具有表现性,并且适合于C++而不是一个愚蠢的翻译,那么这样如何:
使用尺寸-1 POD-类型为件.
添加您可能需要的所有方便方法:
struct Piece {
unsigned char value;
constexpr Piece() : value() {}
constexpr operator bool() const {return !value;}
constexpr bool empty() const {return *this;};
constexpr bool black() const {return value&0x80;}
constexpr bool white() const {return value && !black();}
constexpr unsigned piece() const {return value & 0x7f;}
};现在,这将是一个等效的原始数组:
Piece board[8][8];或者使用std::array
#include <array>
std::array<std::array<Piece, 8>, 8> board;https://stackoverflow.com/questions/26015704
复制相似问题