简体   繁体   English

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

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

I currently have a class where I need accomplish the equivalent of the following (I can't post my actual code): 我目前有一个需要完成以下等效操作的类(我无法发布实际代码):

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])
    {}
};

The problem is that splitData is expensive, and I would like to run it only once. 问题是splitData很昂贵,我只想运行一次。 Normally, I would store the result in a local variable in the body of the constructor, but, in this case, many of the members are not default constructible, so I have to initialize them in the initializer list. 通常,我会将结果存储在构造函数主体中的局部变量中,但是,在这种情况下,许多成员不是默认可构造的,因此我必须在初始化列表中对其进行初始化。

I know in C++11 I could use delegating constructors to solve my problem: 我知道在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])
    {}
};

But I can't figure out any way to do it in C++03. 但是我不知道在C ++ 03中有什么方法可以做到这一点。

How about you make split_result a member you just use for initialization: 如何使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])
    {}
};

Just make sure you declare it before the other members, so it is initialized first. 只需确保在其他成员之前声明它,即可首先对其进行初始化。 Member initialization order is determined by the order in which they are defined in the class. 成员初始化顺序由在类中定义它们的顺序确定。

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

This is not checked, I'm on a mobile phone... 尚未选中,我正在使用手机...

** UPD ** no it won't work. ** UPD **不,它将不起作用。 A new attempt: 新尝试:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM