Член функции класса не зависит от членов класса - PullRequest
2 голосов
/ 24 января 2011

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

Ответы [ 5 ]

7 голосов
/ 24 января 2011

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

1 голос
/ 24 января 2011

Предполагая, что вы имеете в виду «не зависит от каких-либо непубличных участников», Скотт Мейерс однажды ответил на определенный нет на этот вопрос.

Однако он сосредоточился только на инкапсуляции: инкапсуляция улучшается за счет того, что эти функции не являются членами.

Другие соображения могут, например, включать то, что вы не можете вызвать operator<< для временного, если оператор определен как не член. (Зачем вам это нужно? Ну, например, для создания строкового аргумента из составных частей в стиле iostream.)

И соображения могут включать просто, насколько естественным и понятным является использование обозначений. Запись с вложенными вызовами (как для не членов) может быть довольно раздражающей и неясной. Вот почему у нас есть -> как синтаксический сахар для * разыменования + выбор элемента.

Итак, если вы сосредоточены только на инкапсуляции, то выведите эти функции-члены из класса, как советовал Скотт Мейерс. И в противном случае примите инженерное решение, в котором также учитываются такие аспекты, как удобство использования и четкость обозначений. Во всяком случае, не беспокойтесь об этом: это, вероятно, не невероятно важно. : -)

Приветствия & hth.,

0 голосов
/ 24 января 2011

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

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

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

0 голосов
/ 24 января 2011

Это часто происходит при переопределении виртуальной функции.Например, если базовый класс имеет чисто виртуальный тип getWidgetCount (), а ваш производный класс не поддерживает виджеты, он просто вернет 0.

0 голосов
/ 24 января 2011

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

Причина, по которой это просто разработка, и будущий разработчик знает, где искать.

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