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

如何基于配置文件参数构造类中已默认初始化的成员对象?

解决方法

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 18:48:40