You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明未指定大小的不可变对象数组作为类字段(不可用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 10:36:01