Функции частного класса против функций в безымянном пространстве имен

Я обнаружил, что у меня нет функций частного класса. Если это возможно, все кандидаты в функции частного класса, скорее всего, помещаются в безымянное пространство имен и передают всю необходимую информацию в качестве параметров функции. У меня нет четкого объяснения, почему я это делаю, но, по крайней мере, для меня это выглядит более естественно. Как следствие, мне нужно раскрыть меньше внутренних деталей в заголовочном файле.

Каково ваше мнение - правильная ли это практика?

43
задан Wolf 2 September 2014 в 09:56
поделиться

4 ответа

В полу-больших проектах, где я обычно работаю (более 2 миллионов строк кода), я бы запретил функции частных классов, если бы мог. Причина в том, что функция частного класса является частной, но все же видна в файле заголовка. Это означает, что если я каким-либо образом изменю подпись (или комментарий), меня иногда вознаграждают полной перекомпиляцией, которая стоит несколько минут (или часов, в зависимости от проекта).

Просто откажитесь от этого и скройте то, что является личным, в файле cpp.

Если бы я начал с нуля в большом проекте C ++, я бы применил PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom , чтобы переместить еще более личные детали в файл cpp.

18
ответ дан 26 November 2019 в 23:09
поделиться

Думаю, это хорошая практика. Часто он позволяет скрыть вспомогательные структуры и типы данных, что снижает частоту и размер перестроек. Это также упрощает разделение функций на другой модуль, если окажется, что они полезны где-то еще.

3
ответ дан 26 November 2019 в 23:09
поделиться

В основном это сводится к вопросу о том, действительно ли рассматриваемая функция имеет смысл как часть класса. Если ваше единственное намерение - сохранить детали класса вне заголовка, я бы подумал об использовании вместо этого идиомы pimpl.

5
ответ дан 26 November 2019 в 23:09
поделиться

Я делал это раньше, и это всегда плохо заканчивалось. Вы не можете передавать объекты класса функциям, поскольку им нужен доступ к закрытым членам, предположительно по ссылке (или вы получите запутанные списки параметров), поэтому вы не можете вызывать методы общедоступного класса. И вы не можете вызывать виртуальные функции по той же причине. Я твердо верю (основываясь на опыте), что это плохая идея.

Итог: Это похоже на идею, которая могла бы сработать, когда «модуль» реализации имеет некоторый специальный доступ к классу, но это не так в C ++.

11
ответ дан 26 November 2019 в 23:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: