c++ - 如何在成员初始值设定项列表之外初始化类成员

标签 c++ initialization member

我有一个C++类,该类在其构造函数中使用字符串(文件路径),将该文件加载到JSON中,然后使用一些JSON变量初始化另一个成员。

由于需要首先加载文件,并且需要初始化JSON(从流中初始化),因此我无法在成员初始化器列表中初始化thing。我应该为JSON使用另一个包装器类,还是使用new ...?我该如何实现?

class Dummy
{
    std::string _configFilePath;
    json configJson;
    Thing thing;

    Dummy(std::string configFilePath = "../config.json") :
    _configFilePath(configFilePath)
    {
        std::ifstream ifs(configFilePath);
        ifs >> configJson;
        thing(configJson["whatever"]); // thing can't be initialized here
    }
};

请注意,thing不是默认可构造的。

最佳答案

您可以使用一个辅助函数来执行当前构造函数的操作:

class Dummy
{
    std::string _configFilePath;
    json configJson;
    Thing thing;

    Thing loader() {
        std::ifstream ifs(_configFilePath);
        ifs >> configJson;
        return Thing(configJson["whatever"]);
    }

    Dummy(std::string configFilePath = "../config.json") :
        _configFilePath(configFilePath), thing(loader())
    {
    }
};

这将构造_configFilePath和默认构造configJson,然后调用loader加载东西。 RVO应该直接在thing中启用loader的构造。

关于c++ - 如何在成员初始值设定项列表之外初始化类成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60764035/

相关文章:

c++ - 向类中添加新成员变量会影响二进制兼容性吗?

c# - 如何以正确的方式初始化 KeyValuePair 对象?

c++ - 如何仅在实际使用成员模板时才在成员模板中进行 static_assert?

c++ - 为什么模板类型推导在这里失败了?

c++ - 如何将提取的栅格信息转换为opencv库可处理的格式

c - 一个字符串会占用多少字节,初始化为较少的字母

c# - 我添加了一个用户并将他分配给一个角色,当我使用 Membership.GetAllUsers() 时它没有返回

c - 包含的结构定义无法识别

c++ - 私有(private)成员黑客行为是否已定义?

ruby-on-rails - ruby on rails 中的类变量未初始化错误