Закрытые поля и методы не должны быть доступны никому, кроме класса, который их объявляет. Однако бывают ситуации, когда это необходимо. Например, если вы хотите сериализовать / распечатать структуру. В этих случаях вы можете объявить функцию или другой класс с ключевым словом friend
. Так, например:
struct abc
{
private:
friend std::ostream &operator<<(std::ostream &stream, const abc &s);
int a;
};
Затем вы реализуете функцию с такой же сигнатурой std::ostream &operator<<(std::ostream &stream, const abc &s);
где-нибудь, и у нее будет доступ к abc::a
:
std::ostream &operator<<(std::ostream &stream, const abc &s)
{
return stream << s.a;
}
Это позволит использовать вашу структуру, например, с std::cout
.
Обратите внимание, что не так много подлинных случаев, подобных этому, и вам следует избегать максимально возможного использования friend
. В этом случае, например, метод get будет делать то же самое, и вы избежите всей проблемы, не нарушая инкапсуляцию.