如何声明未指定大小的不可变对象数组作为类字段(不可用vector)
你给出的写法不符合C++标准规范:类的非静态成员不允许声明为未指定大小的数组list_pair arr[],构造函数内的arr[size]只是尝试访问下标为size的数组元素,无法完成数组初始化操作。
针对你「类字段不可变、不能使用vector、运行期指定数组大小」的需求,可通过以下两种合法方案实现:
方案1:编译期确定数组大小(性能最优,无动态分配开销)
通过类模板将数组大小作为编译期参数传递,直接声明固定大小的常量数组:
#include <list> #include <utility> #include <string> using list_pair = std::list<std::pair<int, std::string>>; template <size_t ArrSize> class tree { private: // 常量数组成员,大小编译期确定,不可修改 const list_pair arr[ArrSize]; public: // 构造函数可以按需初始化数组元素 tree() = default; }; // 使用示例,声明大小为10的tree实例 tree<10> t;
方案2:运行期动态指定数组大小
使用std::unique_ptr<list_pair[]>作为常量成员,在构造函数初始化列表中完成动态数组的分配,初始化后指针指向不可修改,满足不可变要求:
#include <list> #include <utility> #include <string> #include <memory> using list_pair = std::list<std::pair<int, std::string>>; class tree { private: // 常量智能指针,持有动态数组,初始化后指向不可变 const std::unique_ptr<list_pair[]> arr; public: // 初始化列表中完成数组分配 tree(int size) : arr(std::make_unique<list_pair[]>(size)) {} // 示例:访问数组元素的接口 const list_pair& get(size_t index) const { return arr[index]; } }; // 使用示例,构造时指定大小为10 tree t(10);
如果你需要数组元素也不可修改,可将成员声明为
const std::unique_ptr<const list_pair[]> arr,配合std::make_unique<const list_pair[]>(size)初始化即可。
内容的提问来源于stack exchange,提问作者nadirhan
相关产品推荐
相关产品推荐

