Использовать результат вызова функции для инициализации нескольких членов в C ++ 03? - PullRequest
0 голосов
/ 27 марта 2012

В настоящее время у меня есть класс, в котором мне нужно выполнить эквивалент следующего (я не могу опубликовать свой фактический код):

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.

Ответы [ 2 ]

4 голосов
/ 27 марта 2012

Как насчет сделать 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])
    {}
};

Просто убедитесь, что вы объявили об этом раньше других участников, поэтому он инициализируется первым. Порядок инициализации членов определяется порядком, в котором они определены в классе.

2 голосов
/ 27 марта 2012
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]), 
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...