我是C++的新手,我正在将Java项目移植到C++.
考虑以下Java代码,其中Piece是表示棋子的类:
Piece[][] myPieces = new Piece[8][8];
Run Code Online (Sandbox Code Playgroud)
它创建一个数组,其中所有条目都为null.
如何在C++中实现相同的功能?我试过了:
Piece* myPieces = new Piece[8][8];
Run Code Online (Sandbox Code Playgroud)
但是这将创建一个数组,其中所有条目都使用默认构造函数初始化.
谢谢
编辑:我希望C++代码高效/优雅,我不关心也不想将粘贴从Java复制到C++.如果需要,我很乐意大量修改代码结构.
编辑2:代码用于国际象棋程序,数组的大小永远不会改变,性能至关重要.
在C++中声明一个8x8可选对象数组的最简单方法是这样的:
boost::optional<Piece> myPieces[8][8];
Run Code Online (Sandbox Code Playgroud)
该 boost::optional类型表示一个可选对象(如Java中的可空引用),它没有使用指针类型的所有缺陷.它应该在未来几年作为标准库的一部分提供.
您可能更喜欢使用std::array类型,它是固定大小数组的封装,允许它们被视为一等公民,并提供更好的界面:
std::array<std::array<boost::optional<Piece>, 8>, 8> myPieces;
Run Code Online (Sandbox Code Playgroud)
如果您希望能够在运行时调整阵列大小,请考虑std::vector改为.
正如你想要的那样,并且正确的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;}
};
Run Code Online (Sandbox Code Playgroud)
现在这将是一个等效的原始数组:
Piece board[8][8];
Run Code Online (Sandbox Code Playgroud)
或使用std::array:
#include <array>
std::array<std::array<Piece, 8>, 8> board;
Run Code Online (Sandbox Code Playgroud)
答案取决于,因为与 Java 相反,在 C++ 中,您有不同的所有权语义和对象生命周期管理(两者是相辅相成的)。
如果你想对类似于java的对象进行建模,你可以这样写:
using PiecePtr = std::shared_ptr<Piece>;
std::array<std::array<PiecePtr, 8>, 8> Pieces;
Run Code Online (Sandbox Code Playgroud)
Shared_ptr 与 java 对象具有相似的语义(将其传递到任何地方,只要存在对它的引用,它的生命周期就得到保证)。
如果您想对观察到的对象进行建模(即数组不拥有它们),您应该编写:
using PiecePtr = Piece*;
std::array<std::array<PiecePtr, 8>, 8> Pieces;
Run Code Online (Sandbox Code Playgroud)
这确保了当Pieces对象被销毁时,实际的片段本身仍保留在内存中。
如果您想对Pieces数组拥有的唯一对象进行建模,您应该使用:
using PiecePtr = std::unique_ptr<Piece>;
std::array<std::array<PiecePtr, 8>, 8> Pieces;
Run Code Online (Sandbox Code Playgroud)
这确保了当 Pieces 对象被销毁时,实际的片段本身也会被销毁。
| 归档时间: |
|
| 查看次数: |
715 次 |
| 最近记录: |