我是C的新手,我正在将一个
Java项目移植到C.
考虑以下Java代码,其中Piece是表示棋子的类:
Piece[][] myPieces = new Piece[8][8];
它创建一个数组,其中所有条目都为null.
我怎样才能在C中实现同样的目标?我试过了:
Piece* myPieces = new Piece[8][8];
但是这将创建一个数组,其中所有条目都使用默认构造函数初始化.
谢谢
解决方法
答案取决于,因为与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,实际的部件本身也会被销毁.