Как мы знаем, что выходные параметры действительно плохо
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> > ¶m,
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();
}
}
Теперь, как я могу избежать выходных параметров здесь, чтобы я мог вернуть список вывода?
Выходные параметры все время отображаются в C ++. Однако вы можете инкапсулировать структуру выходных данных с помощью методов.
class ComboGenerator {
public:
void getCombinations(list<list<string> > ¶m,
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 # по умолчанию используют ссылки на объекты. Лучшая производительность, простота в использовании и т. Д.
Редактировать: Если вы действительно хотите это сделать, вы можете использовать константную ссылку в качестве выходного параметра. Пока это константная ссылка, она будет поддерживаться, даже если в коде был вызван деструктор ссылочного объекта.
Вы также можете определить копию, правильно переместить конструкторы (то есть вам нужно создать класс-оболочку над списками), как вы сказали ранее.