Как функции, не являющиеся членами, улучшают инкапсуляциюC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как функции, не являющиеся членами, улучшают инкапсуляцию

Сообщение Anonymous »

Я прочитал статью Скотта Мейерса на эту тему и совершенно не понял, о чем он говорит. У меня здесь 3 вопроса.

Вопрос 1

Для подробного объяснения предположим, что я пишу простой класс вектора с такими методами, как push_back, Insert и оператор []. Если бы я следовал алгоритму Мейерса, я бы получил все дружественные функции, не являющиеся членами. У меня будет векторный класс с небольшим количеством частных членов и множеством дружественных функций, не являющихся членами. Он об этом говорит?

Вопрос 2

Я до сих пор не понимаю, как функции, не являющиеся членами, улучшают инкапсуляцию. Рассмотрим код, приведенный в статье Мейерса.

Код: Выделить всё

class Point {
public:
int getXValue() const;
int getYValue() const;
void setXValue(int newXValue);
void setYValue(int newYValue);

private:
...                 // whatever...
};
Если следовать его алгоритму, методы setXXXX не должны быть членами. Мой вопрос: как это увеличивает инкапсуляцию? Он также говорит:


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


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

Вопрос 3

Цитируем его алгоритм

Код: Выделить всё

else if (f needs type conversions
on its left-most argument)
{
make f a non-member function;
if (f needs access to non-public
members of C)
make f a friend of C;
}
Что он имел в виду, говоря, что f требует преобразования типов в самом левом аргументе?
В статье он также говорит следующее.


Более того, теперь мы видим, что
распространенное утверждение о том, что «дружественные функции
нарушают инкапсуляцию» не совсем
верно. Друзья не нарушают
инкапсуляцию, они просто уменьшают ее —
точно так же, как и функции-члены
.


Этот и приведенный выше алгоритм противоречат друг другу, не так ли?

Подробнее здесь: https://stackoverflow.com/questions/169 ... apsulation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»