должен класс C++ “функции помощника” быть участниками, свободными, или свободное скоро-пространство-имен?

Что относительно этого:

System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
16
задан rlbond 17 July 2009 в 20:22
поделиться

7 ответов

Бесплатная функция / функция-член

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

Доступ

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

Если другой код выиграет от использования кода, опубликуйте его в интерфейсе. Это означает сделать его защищенным, если он является членом или имеет бесплатную функцию, доступную через заголовок в именованном пространстве имен (или глобальном пространстве имен).

9
ответ дан 30 November 2019 в 21:11
поделиться

Обычно я делаю вспомогательные подпрограммы "бесплатными" подпрограммами в автономном пространстве имен, если это возможно. Таким образом, я не усложняю интерфейс (отключенный в файле * .h) вещами, о которых клиентам не нужно беспокоиться.

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

12
ответ дан 30 November 2019 в 21:11
поделиться

Я обычно делаю их защищенными или частными функциями-членами. Это будет зависеть от того, планируете ли вы создать класс и переопределить функции.

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

3
ответ дан 30 November 2019 в 21:11
поделиться

Я думаю, вам следует запретить отображение диалогового окна загрузки. Вот один из способов сделать это:

  • Код Javascript заставляет ваш элемент управления WebBrowser переходить к определенному URL-адресу (что может вызвать появление диалогового окна загрузки).

  • Чтобы предотвратить фактический переход элемента управления WebBrowser к этому URL-адресу, прикрепите обработчик событий к событию Navigating.

  • В событии Navigating вам нужно будет проанализировать, является ли это действительным действием Navigating, которое вы хотите остановить (это URL-адрес загрузки, возможно, проверьте расширение файла, должен быть узнаваемый формат). Для этого используйте WebBrowserNavigatingEventArgs.Url.

  • Если это правильный URL, остановите навигацию, установив свойство WebBrowserNavigatingEventArgs.Cancel. См. Мой ответ здесь , чтобы узнать почему.

2
ответ дан 30 November 2019 в 21:11
поделиться

Тот факт, что вы упоминаете бесплатные функции, заставляет меня думать, что «множество других операторов» не требует доступа к данным класса. Если да, сделайте их бесплатными. Это снижает сложность заголовка вашего класса, а бесплатные функции проще использовать в стандартных алгоритмах (возможно, std :: for_each, поскольку вы все равно работаете с векторами?).

2
ответ дан 30 November 2019 в 21:11
поделиться

Подумайте о размахе. Будут ли эти функции использоваться в другом классе или где-то еще? Должны ли они быть общедоступными?

Мне кажется, что они должны быть частными функциями-членами, но все зависит от вашей общей структуры области видимости.

0
ответ дан 30 November 2019 в 21:11
поделиться

Функции-члены, конечно, если исходная функция имела смысл как функция-член.

Частный / защищенный IMHO зависит от того, как используется их функциональность: если операция исходной функции все еще требуется, а рефакторинг заключается исключительно в том, чтобы сделать код более чистым, затем сделать их защищенными или частными и вызывать их из обычной функции. Вы получите рефакторинг, но при этом сохраните открытый интерфейс класса нетронутым.

0
ответ дан 30 November 2019 в 21:11
поделиться
Другие вопросы по тегам:

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