Свободная функция против функции члена

В чем преимущество наличия свободной функции (в анонимном пространстве имен и доступной только в одном исходном файле) и отправки всех переменных в качестве параметров по сравнению с тем, что функция-член частного класса свободна от каких-либо параметров и имеет прямой доступ к переменным-членам? Спасибо!

заголовок:

 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
}

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

16

Решение

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

// 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.

11

Другие решения

увидеть этот вопрос: Эффективный пункт 23 C ++. Предпочитать функции, не являющиеся членами, не являющимися друзьями.
а также Функции-члены C ++ и бесплатные функции

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

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

Это точка книги 101 C ++ стандарты кодирования, который заявляет, что предпочитает свободную функцию и статическую функцию над функциями-членами.

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

это ответ гласит: «причина этого правила в том, что при использовании функций-членов вы можете слишком сильно полагаться на внутренние компоненты класса».

10

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

В вашем примере DoSomething2 Метод не делает ничего, чтобы уменьшить связь, так как он все еще должен получить доступ к закрытому члену, передав его по ссылке. Почти наверняка более очевидно просто сделать мутацию состояния на равнине DoSomething метод вместо.

Когда вы можете реализовать задачу или алгоритм в терминах открытого интерфейса класса, это делает его хорошим кандидатом на создание свободной функции. Скотт Мейерс обобщает разумный набор правил здесь: http://cpptips.com/nmemfunc_encap

5
По вопросам рекламы [email protected]