首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对象数组,Java和C++的区别

对象数组,Java和C++的区别
EN

Stack Overflow用户
提问于 2014-09-24 11:25:38
回答 9查看 853关注 0票数 6

我是C++新手,我正在通过C++项目移植到C++。

考虑以下Java代码,其中部件是表示国际象棋的类:

代码语言:javascript
复制
Piece[][] myPieces = new Piece[8][8];

它创建一个数组,其中所有条目都为空。

我如何在C++中实现同样的目标?我试过:

代码语言:javascript
复制
Piece* myPieces = new Piece[8][8];

但是这将创建一个数组,其中包含使用默认构造函数初始化的所有条目。

谢谢

编辑:,我希望C++代码高效/优雅,我不关心也不想将粘贴从C++复制到C++。如果需要,我很乐意对代码结构进行大量修改。

编辑2:的代码是用于国际象棋程序的,数组的大小将永远不会改变,性能是至关重要的。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2014-09-24 11:35:18

答案取决于,因为与Java相反,在C++中,您有不同的所有权语义和对象生命周期管理(这两者是同时进行的)。

如果您想要对类似于java的对象建模,您可以编写:

代码语言:javascript
复制
using PiecePtr = std::shared_ptr<Piece>;
std::array<std::array<PiecePtr, 8>, 8> Pieces;

shared_ptr具有类似于java对象的语义(只要有对它的引用,就可以在任何地方传递它,并且保证它的生存期)。

如果要对观察到的对象建模(即数组不拥有它们),则应该编写:

代码语言:javascript
复制
using PiecePtr = Piece*;
std::array<std::array<PiecePtr, 8>, 8> Pieces;

这确保了当Pieces对象被销毁时,实际的碎片本身仍保留在内存中。

如果要对Pieces数组所拥有的唯一对象进行建模,则应使用:

代码语言:javascript
复制
using PiecePtr = std::unique_ptr<Piece>;
std::array<std::array<PiecePtr, 8>, 8> Pieces;

这确保了当碎片对象被销毁时,实际的碎片本身也会被销毁。

票数 3
EN

Stack Overflow用户

发布于 2014-09-24 11:36:42

在C++中声明一个8x8可选对象数组的最简单方法如下:

代码语言:javascript
复制
boost::optional<Piece> myPieces[8][8];

boost::optional类型表示一个可选对象(如您在Java中的可空引用),它没有使用指针类型的所有缺陷。它将在未来几年作为标准库的一部分提供。

您可能更喜欢使用std::array类型,它是对固定大小数组的封装,它允许将它们视为一流的公民,并提供更好的接口:

代码语言:javascript
复制
std::array<std::array<boost::optional<Piece>, 8>, 8> myPieces;

如果希望能够在运行时调整数组的大小,请考虑使用std::vector

票数 7
EN

Stack Overflow用户

发布于 2014-09-24 11:44:50

由于您希望它具有表现性,并且适合于C++而不是一个愚蠢的翻译,那么这样如何:

使用尺寸-1 POD-类型为件.

添加您可能需要的所有方便方法:

代码语言:javascript
复制
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;}
};

现在,这将是一个等效的原始数组:

代码语言:javascript
复制
Piece board[8][8];

或者使用std::array

代码语言:javascript
复制
#include <array>
std::array<std::array<Piece, 8>, 8> board;
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26015704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档