如何基于配置文件参数构造类中已默认初始化的成员对象?
解决方法
方案1:给doubleBuffer添加重置方法
直接给doubleBuffer类新增一个reset成员函数,用于重新分配缓冲区。读取完配置后调用该方法,就能用解析得到的size重新初始化缓冲区。
修正并补充后的代码:
#include <cstdint> class doubleBuffer { int _size = 0; uint8_t* _buf = nullptr; // 原代码此处类型错误,修正为指针 public: doubleBuffer(int size) : _size(size) { _buf = new uint8_t[_size]; } doubleBuffer() = default; // 新增重置方法 void reset(int size) { // 先释放旧内存,避免泄漏 if (_buf != nullptr) { delete[] _buf; _buf = nullptr; } _size = size; if (size > 0) { _buf = new uint8_t[_size]; } } // 新增析构函数释放内存 ~doubleBuffer() { delete[] _buf; } // 禁用拷贝构造和赋值,避免浅拷贝导致的内存问题 doubleBuffer(const doubleBuffer&) = delete; doubleBuffer& operator=(const doubleBuffer&) = delete; }; class client { doubleBuffer _db; int _size = 0; public: client() { readConfiguration(); // 读完配置后重置缓冲区 _db.reset(_size); } void readConfiguration() { // 模拟从配置文件读取size _size = 1024; } }; int main() { client cl; return 0; }
方案2:用智能指针延迟初始化
把client类中的_db成员改为std::unique_ptr<doubleBuffer>,默认构造时仅为空指针,读取完配置后再构造doubleBuffer对象,彻底跳过默认构造的步骤。
代码示例:
#include <cstdint> #include <memory> class doubleBuffer { int _size = 0; uint8_t* _buf = nullptr; public: doubleBuffer(int size) : _size(size) { _buf = new uint8_t[_size]; } ~doubleBuffer() { delete[] _buf; } // 禁用拷贝构造和赋值 doubleBuffer(const doubleBuffer&) = delete; doubleBuffer& operator=(const doubleBuffer&) = delete; }; class client { std::unique_ptr<doubleBuffer> _db; int _size = 0; public: client() { readConfiguration(); // 用配置的size构造doubleBuffer _db = std::make_unique<doubleBuffer>(_size); } void readConfiguration() { _size = 1024; } }; int main() { client cl; return 0; }
此方案下doubleBuffer可以直接删除默认构造函数,避免出现未初始化的无效状态。
方案3:提前读取配置再初始化成员
如果配置读取逻辑简单、无副作用,可以把读取配置的逻辑封装成静态函数,在client的构造函数初始化列表中先获取size,再直接用该值初始化_db,一步到位完成正确构造。
代码示例:
#include <cstdint> class doubleBuffer { int _size = 0; uint8_t* _buf = nullptr; public: doubleBuffer(int size) : _size(size) { _buf = new uint8_t[_size]; } ~doubleBuffer() { delete[] _buf; } // 禁用拷贝构造和赋值 doubleBuffer(const doubleBuffer&) = delete; doubleBuffer& operator=(const doubleBuffer&) = delete; }; class client { doubleBuffer _db; int _size; // 静态函数读取配置并返回size static int readConfiguration() { return 1024; // 模拟读取配置 } public: // 初始化列表中先获取size,再构造_db client() : _size(readConfiguration()), _db(_size) { } }; int main() { client cl; return 0; }
内容的提问来源于stack exchange,提问作者Yaniv G
相关产品推荐
相关产品推荐

