对象数组,Java和C之间的区别

前端之家收集整理的这篇文章主要介绍了对象数组,Java和C之间的区别前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是C的新手,我正在将一个 Java项目移植到C.

考虑以下Java代码,其中Piece是表示棋子的类:

Piece[][] myPieces = new Piece[8][8];

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

我怎样才能在C中实现同样的目标?我试过了:

Piece* myPieces = new Piece[8][8];

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

谢谢

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

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

解决方法

答案取决于,因为与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> Pieces;

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

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

using PiecePtr = std::unique_ptr<Piece>;
std::array<std::array<PiecePtr,实际的部件本身也会被销毁.

猜你在找的Java相关文章