如何初始化存储智能指针的std::array?
解决二维
std::array搭配std::unique_ptr的初始化问题 嘿,我来帮你搞定这个问题~
首先,你遇到的报错根源是**std::make_unique的用法错了**,跟std::array和智能指针的搭配没关系——这俩完全可以一起用,这点你放心!
错误原因拆解
你写的std::make_unique<Spot>(new Spot())是典型的误用:std::make_unique的设计目的就是帮你自动完成内存分配(替代手动new),它接收的参数是目标类构造函数的参数,而不是一个已经用new创建好的指针。你现在传了new Spot()(一个Spot*类型),但Spot的构造函数应该是期望const Spot&(拷贝构造)或者其他合法参数,所以编译器才会报错说“无法将Spot*转换为const Spot&”。
正确的初始化代码
直接去掉多余的new,调用std::make_unique<Spot>()即可。如果Spot的构造函数需要参数(比如接收行列坐标),直接把参数传给make_unique就行:
static const int WIDTH = 7; static const int HEIGHT = 6; std::array<std::array<std::unique_ptr<Spot>, WIDTH>, HEIGHT> field; // 基础版初始化(无参构造) for (int i = 0; i < HEIGHT; ++i) { for (int j = 0; j < WIDTH; ++j) { field[i][j] = std::make_unique<Spot>(); // 如果Spot有带参构造,比如Spot(int row, int col),这么写: // field[i][j] = std::make_unique<Spot>(i, j); } }
更简洁的写法(C++20+)
如果你的编译器支持C++20或更高版本,还可以用范围for循环简化代码,可读性更好:
for (auto& row : field) { for (auto& spot_ptr : row) { spot_ptr = std::make_unique<Spot>(); } }
关于std::array和智能指针的兼容性
完全没问题!std::array是固定大小的容器,只要元素类型支持移动/拷贝操作(std::unique_ptr支持移动),就可以作为它的元素。你之前的困惑只是因为搜索结果没覆盖到std::array嵌套+unique_ptr的场景,但这种用法是完全合法且常用的。
内容的提问来源于stack exchange,提问作者Asator
相关产品推荐
相关产品推荐

