Функции-члены C ++ и бесплатные функции - PullRequest
27 голосов
/ 09 июня 2009

Я все время путаюсь с этим дизайнерским решением, когда пишу программы, но я не уверен на 100%, когда мне нужно сделать функцию функцией-членом класса, когда выйти это как обычная функция, в которой другие исходные файлы могут вызывать функцию, когда объявление функции отображается в заголовочном файле. Требуемый доступ к переменным-членам класса имеет отношение к решению в большинстве случаев?

Ответы [ 3 ]

28 голосов
/ 09 июня 2009

Принцип интерфейса Херба Саттера

Для класса X все функции, включая свободные функции, которые оба
(а) «упомянуть» Х и
(б) «поставляются с» X
логически являются частью X, потому что они образуют часть интерфейса X.

Для подробного обсуждения прочитайте Пространства имен и принцип взаимодействия Херба Саттера.

EDIT
На самом деле, если вы хотите понять C ++, читайте все , что написал Херб Саттер

2 голосов
/ 09 июня 2009

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

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

0 голосов
/ 09 июня 2009

Если что-то нужно для доступа к переменным-членам или некоторому аспекту экземпляра объекта, то это должен быть метод.

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...