Как я могу избежать выходных параметров при выполнении возврата?

Как мы знаем, что выходные параметры действительно плохо

 void foo(set<int> *x)

Здесь x - это ожидаемые параметры, это довольно распространенная практика в системных вызовах Linux. Но для C++ это не очень хорошая практика кодирования.

У меня есть сценарий, где я должен вернуться через список списка строк и вернуть все возможные комбинации строк из каждого списка.

 a b 
 d e 
 f g
 Possible combinations are:
    a d f, a d g, a e f, a e g, etc...

list<list<string> > parameters;

Простое решение для возврата будет:

    void  getCombinations(list<list<string> > &param, 
          list<list<string> >::iterator it, 
          vector<string> &backtracker, 
          list<vector<string> > &output){

          if(it == param.end()){
              output.append(backtracker);
          }
          for(auto i = it->begin; i!= it->end(); i++){
            backtracker.push_back(*i);
             getCombinations(param, it+1, backtracker, output)
            backtracker.pop_back();
          }
         }

Теперь, как я могу избежать выходных параметров здесь, чтобы я мог вернуть список вывода?

2 ответа

Выходные параметры все время отображаются в C++. Однако вы можете инкапсулировать структуру выходных данных с помощью методов.

class ComboGenerator {
public:
  void getCombinations(list<list<string> > &param, 
    list<list<string> >::iterator it, 
    vector<string> &backtracker){

    if(it == param.end()){
      result.append(backtracker);
    }
    for(auto i = it->begin; i!= it->end(); i++){
      backtracker.push_back(*i);
      getCombinations(param, it+1, backtracker)
      backtracker.pop_back();
    }
  }

  list<list<string>> &getResult() { return result; }

private:
  list<list<string>> result;    
};

Мой опыт показывает, что в 95% случаев кто-то занимается мыльными делами по поводу практики, это личная непристойность. Остальные 5% времени это хороший здравый смысл.

Насколько я знаю, выходные параметры - это хорошая практика, в зависимости от того, что вы делаете. Вот для чего нужны указатели или ссылки. И именно поэтому Java или C# по умолчанию используют ссылки на объекты. Лучшая производительность, простота в использовании и т. Д.

Редактировать: Если вы действительно хотите это сделать, вы можете использовать константную ссылку в качестве выходного параметра. Пока это константная ссылка, она будет поддерживаться, даже если в коде был вызван деструктор ссылочного объекта.

Вы также можете определить копию, правильно переместить конструкторы (то есть вам нужно создать класс-оболочку над списками), как вы сказали ранее.

Другие вопросы по тегам