В каких сценариях нужно объявить функцию членства друг?

Ваше понимание форм правильное. Из контекста, вероятно, x_train являются 60k изображений рукописных чисел (с разрешением 28x28 пикселей), а y_train просто 60k истинных чисел, которые показывают изображения.

5
задан mezoid 21 February 2009 в 10:05
поделиться

6 ответов

Вы использовали бы друга функция для того же вида причин, что Вы будете использовать друга класс, но на функции членства (а не весь класс) основание. Некоторые хорошие объяснения находятся в этом потоке.

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

Также см. эту статью еще для некоторой информации о друге классы и функции.

2
ответ дан 14 December 2019 в 19:27
поделиться

Посмотрите C++ облегченный FAQ:

Иногда друзья синтаксически лучше (например, в классе Fred, друг, функции позволяют параметру Fred быть вторым, в то время как участники требуют, чтобы это было первым). Другое хорошее использование друга функции является двоичными инфиксными арифметическими операторами. Например, aComplex + aComplex должен быть определен как друг, а не участник, если Вы хотите позволить на плаву + aComplex также (функции членства не позволяют продвижение левого аргумента, так как это изменило бы класс объекта, который является получателем вызова функции членства).

1
ответ дан 14 December 2019 в 19:27
поделиться

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

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

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

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

2
ответ дан 14 December 2019 в 19:27
поделиться

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

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

0
ответ дан 14 December 2019 в 19:27
поделиться

Один момент, который я считаю важным: классы-члены имеют доступ к закрытым частям содержащего класса. Иногда это может быть лучшей альтернативой «другу».

class A
{
private:
  int b;
public:
  class MemberNotFriend {
  public:
    static void test() {
      A a;
      a.b = 0;
    }
  };


};


void test()
{
  A::MemberNotFriend::test();
}
0
ответ дан 14 December 2019 в 19:27
поделиться

Вот простой конкретный пример того, как я использую функцию друга:

У меня есть игра, в которой каждый спрайт-объект хранит свою информацию, такую ​​как положение X, Y, как закрытые члены. Однако я хочу отделить игровые объекты от рендеринга: игровому объекту не нужны точные детали того, как он рендерится. Игровой объект хранит только игровое состояние, и это игровое состояние может быть визуализировано множеством различных способов.

Таким образом, класс игрового объекта имеет функцию друга: render (). Функция render () реализована вне класса игрового объекта, но она может обращаться к элементам положения X, Y по мере необходимости для визуализации игрового объекта.

0
ответ дан 14 December 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: