2009-06-08 3 views
24

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

+9

Также обратите внимание, что «метод» - это общий объектно-ориентированный термин. C++ не имеет «методов», просто «функций». В стандарте C++ никогда не используется термин «метод». Вместо этого предпочитайте использовать «функцию-член» или «свободную функцию». –

+1

Комментарий Брайана действительно должен быть ответом. Это то, что ищут большинство людей, которые приходят сюда ... этот вопрос даже не упоминает о методах. – 2012-08-09 19:33:43

+0

Согласовано. Вероятно, нужно изменить название вопроса, оно действительно вводит в заблуждение. – Ben

ответ

26

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

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

для углубленного обсуждения чтения Namespaces and the Interface Principle Херб Саттер.

EDIT
На самом деле, если вы хотите понять, C++ идти и читать все, что написал Herb Sutter :)

+0

Спасибо за ваш ответ. Ссылка довольно описательная. – stanigator

+8

(+1). Мне также нравится этот Скотт Майерс: http://www.ddj.com/cpp/184401197. Я думаю, статьи Скотта и Херба очень дополняют друг друга. –

+1

Я в замешательстве. Связанная статья касается пространств имен, но вопрос не спрашивает об пространствах имен. Он спрашивает, когда «свободные функции» и «функции-члены». –

0

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

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

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

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

+0

C++ не имеет понятия методов. – 2012-08-09 19:43:11

+4

способ == функция-член – PSkocik

2

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

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

Смежные вопросы