使用函数调用结果在C++03中初始化多个成员

Use function call result to initialize multiple members in C++03?

本文关键字:初始化 成员 C++03 函数调用 结果      更新时间:2023-10-16

我目前有一个类,需要完成以下等效任务(我无法发布实际代码):

class Data
{
public:
    Data(const std::string &data_string)
      : member_1(splitData(data_string)[0]),
        member_2(splitData(data_string)[1]),
        member_3(splitData(data_string)[2]),
        member_4(splitData(data_string)[3]),
        member_5(splitData(data_string)[4])
    {}
};

问题是splitData很昂贵,我只想运行一次。通常,我会将结果存储在构造函数主体中的局部变量中,但在这种情况下,许多成员不是默认可构造的,因此我必须在初始值设定项列表中初始化它们。

我知道在C++11中,我可以使用委托构造函数来解决我的问题:

class Data
{
public:
    Data(const std::string &data_string)
      : Data(splitData(data_string)) // splitData only called once
    {}
private:
    Data(const SplitResult &split_result)
      : member_1(split_result[0]),
        member_2(split_result[1]),
        member_3(split_result[2]),
        member_4(split_result[3]),
        member_5(split_result[4])
    {}
};

但我想不出用C++03做这件事的任何方法。

split_result成为一个只用于初始化的成员怎么样:

class Data
{
    SplitResult split_result;
    //declare member_x here
public:
    Data(const std::string &data_string)
      : split_result(splitData(data_string)),
        member_1(split_result[0]),
        member_2(split_result[1]),
        member_3(split_result[2]),
        member_4(split_result[3]),
        member_5(split_result[4])
    {}
};

只需确保在其他成员之前声明它,这样它就会首先初始化。成员初始化顺序由它们在类中定义的顺序决定。

Data (const std::string data_string, 
          SplitResult split_result = split_data(data_string)) : 
    member_1(split_result[0]),
        ...

这没有检查,我在用手机。。。

**UPD**不,它不起作用。新尝试:

Data (const std::string data_string, 
          SplitResult split_result = SplitResult()) :
    member_1((split_result = split_data(data_string))[0]),
    member_2(split_result[1]), 
        ...