В чем преимущество наличия свободной функции (в анонимном пространстве имен и доступной только в одном исходном файле) и отправки всех переменных в качестве параметров по сравнению с тем, что функция-член частного класса свободна от каких-либо параметров и имеет прямой доступ к переменным-членам? Спасибо!
заголовок:
Class A {
int myVariable;
void DoSomething() {
myVariable = 1;
}
};
источник:
namespace {
void DoSomething2(int &a) {
a = 1;
}
}
int A::SomeFunction() {
DoSomething2(myVariable); // calling free function
DoSomething(); // calling member fucntion
}
Если вы предпочитаете делать их членами, то что, если у меня есть случай, когда я сначала вызываю функцию, которая не имеет доступа к переменным-членам, но эта функция вызывает другую функцию, которая обращается к члену. Должны ли они быть членами-членами или свободными?
Одно преимущество функции, не являющейся членом в исходном файле, аналогично преимуществам Идиома: клиентам, использующим ваши заголовки, не нужно перекомпилировать, если вы измените свою реализацию.
// widget.h
class Widget
{
public:
void meh();
private:
int bla_;
};
// widget.cpp
namespace {
void helper(Widget* w) // clients will never know about this
{ /* yadayada */ }
}
void widget::meh()
{ helper(this); }
Конечно, когда написано так, helper()
может использовать только открытый интерфейс Widget
так что вы мало что получаете. Вы можете положить friend
декларация для helper()
внутри Widget
но в какой-то момент вам лучше перейти на полноценное решение Pimpl.
увидеть этот вопрос: Эффективный пункт 23 C ++. Предпочитать функции, не являющиеся членами, не являющимися друзьями.
а также Функции-члены C ++ и бесплатные функции
Вы должны отдавать предпочтение свободным функциям в той степени, в которой это способствует слабой связи.
Рассмотрите возможность сделать его функцией-членом, только если она работает в духе вашего класса, и что вы считаете, что это действительно связано с вашим классом.
Это точка книги 101 C ++ стандарты кодирования, который заявляет, что предпочитает свободную функцию и статическую функцию над функциями-членами.
Хотя это может считаться основанным на мнении, это позволяет немного сохранить класс и разделить проблемы.
это ответ гласит: «причина этого правила в том, что при использовании функций-членов вы можете слишком сильно полагаться на внутренние компоненты класса».
Основное преимущество свободных функций по сравнению с функциями-членами заключается в том, что это помогает отделить интерфейс от реализации. Например, std::sort
не нужно знать что-нибудь о базовом контейнере, с которым он работает, просто о том, что ему предоставлен доступ к контейнеру (через итераторы), который обеспечивает определенные характеристики.
В вашем примере DoSomething2
Метод не делает ничего, чтобы уменьшить связь, так как он все еще должен получить доступ к закрытому члену, передав его по ссылке. Почти наверняка более очевидно просто сделать мутацию состояния на равнине DoSomething
метод вместо.
Когда вы можете реализовать задачу или алгоритм в терминах открытого интерфейса класса, это делает его хорошим кандидатом на создание свободной функции. Скотт Мейерс обобщает разумный набор правил здесь: http://cpptips.com/nmemfunc_encap