Função de amigo - Friend function

Na programação orientada a objetos , uma função amiga , que é uma "amiga" de uma determinada classe , é uma função que recebe o mesmo acesso que os métodos a dados privados e protegidos .

Uma função de amigo é declarada pela classe que está concedendo acesso, portanto, funções de amigo fazem parte da interface da classe, como métodos. As funções de amigo permitem que uma sintaxe alternativa use objetos, por exemplo, em f(x)vez de x.f(), ou em g(x,y)vez de x.g(y). As funções de amigo têm as mesmas implicações no encapsulamento que os métodos.

Um conceito semelhante é o da classe de amigos .

Casos de uso

Essa abordagem pode ser usada em função amigável quando uma função precisa acessar dados privados em objetos de duas classes diferentes. Isso pode ser feito de duas maneiras semelhantes

  • uma função de escopo global ou de namespace pode ser declarada como amiga de ambas as classes
  • uma função de membro de uma classe pode ser declarada como amiga de outra.
#include <iostream>
using namespace std;
 
class Foo; // Forward declaration of class Foo in order for example to compile.
class Bar {
  private:
      int a = 0;
  public:
      void show(Bar& x, Foo& y);
      friend void show(Bar& x, Foo& y); // declaration of global friend
};
 
class Foo {
  private:
      int b = 6;
  public: 
      friend void show(Bar& x, Foo& y); // declaration of global friend
      friend void Bar::show(Bar& x, Foo& y); // declaration of friend from other class 
};
 
// Definition of a member function of Bar; this member is a friend of Foo
void Bar::show(Bar& x, Foo& y) {
  cout << "Show via function member of Bar" << endl;
  cout << "Bar::a = " << x.a << endl;
  cout << "Foo::b = " << y.b << endl;
}
 
// Friend for Bar and Foo, definition of global function
void show(Bar& x, Foo& y) {
  cout << "Show via global function" << endl;
  cout << "Bar::a = " << x.a << endl;
  cout << "Foo::b = " << y.b << endl;
}
 
int main() {
   Bar a;
   Foo b;
 
   show(a,b);
   a.show(a,b);
}

Referências

links externos