C++中const属性(std::vector)的延迟初始化实现方案咨询
实现C++中std::vector属性的延迟初始化且不可修改
最简洁的实现方式可以借助C++17引入的std::optional,结合const引用返回,既保证延迟初始化,又能限制后续修改。以下是示例代码:
#include <vector> #include <optional> class MyClass { private: std::optional<std::vector<int>> data_; // 用optional标记是否已初始化 // 自定义初始化逻辑,可按需修改 std::vector<int> initData() const { return {1, 2, 3, 4}; } public: // get方法:首次调用时完成初始化,之后返回不可修改的引用 const std::vector<int>& getData() { if (!data_) { data_ = initData(); } return *data_; } };
如果需要兼容C++17之前的版本,可以用普通vector加布尔标记的方案:
#include <vector> class MyClass { private: std::vector<int> data_; bool isInitialized_ = false; std::vector<int> initData() const { return {1, 2, 3, 4}; } public: const std::vector<int>& getData() { if (!isInitialized_) { data_ = initData(); isInitialized_ = true; } return data_; } };
两种方案的核心逻辑一致:
- 内部维护可修改的存储对象(或optional包装的对象)
- 通过get方法控制初始化时机,仅在首次调用时执行初始化逻辑
- get方法返回const引用,确保外部无法修改已初始化的vector
如果需要线程安全的实现,可以搭配std::call_once避免多线程下重复初始化:
#include <vector> #include <mutex> class MyClass { private: std::vector<int> data_; std::once_flag initFlag_; void initData() { data_ = {1, 2, 3, 4}; } public: const std::vector<int>& getData() { std::call_once(initFlag_, &MyClass::initData, this); return data_; } };
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

