Я думаю, что это вопрос с наилучшей практикой.C++ Модифицирование себя через пройденное задание
В C++ у меня есть класс-оболочка для пути файловой системы, аналогичного пути os.path Python. В этом классе-оболочке существует функция-член, называемая «Split», которая ищет последний разделитель пути и разделяет его на «хвост» (последняя часть пути) и «голова» (все остальное). В настоящее время функция использует свою собственную переменную-член m_filepath для разделения.
Некоторый код:
class FilePath {
public:
void Split(FilePath& head, FilePath& tail) const
{
FilePath h;
FilePath t;
//initialize h, t with portions of m_filepath...
head = h;
tail = t;
}
private:
std::string m_filepath;
};
int main(int argc, char ** argv)
{
FilePath some_path_1("/");
FilePath some_path_2("/home/");
some_path_1.Split(some_path_1, some_path_2);
return 0;
}
Когда я сделать что-то вроде этого, m_filepath some_path_1 была бы быть перезаписаны любой «голова» оказался. Кажется, что и оператор const не обращает внимания.
Мой вопрос в том, как лучше всего справиться с этим? Выбросить исключение? Разрешить переписывание объекта (это меня беспокоит и звучит небезопасно) и сказать разработчикам быть осторожными? Сделать умное использование заявления о возврате?
Я не думаю, что вам нужно что-либо сделать; если кто-то пишет 'some_path_1.Split (some_path_1, some_path_2);' тогда вы можете предположить, что им известно, что они перезаписывают старое содержимое 'some_path_1'. В манипуляции с трактом это не редкость делать такие вещи - извлекать часть пути на месте, сохраняет необходимость делать другую переменную. –
Просто верните пару новых путей. В этом нет ничего особенного. Отключите выходные аргументы. Функция возвращает свой результат. –