Suponha que um template de classe tenha o cabeçalho template class Ct1 Descreva as relações de friend estabelecidas colocando cada uma das seguintes declarações friend dentro desse template de classe. Os identificadores que começam com ‘f’ são funções, aqueles que começam com ‘C’ são classes, aqueles que começam com ‘Ct’ são templates de classe e T é um parâmetro de tipo de template (ou seja, T pode representar qualquer tipo fundamental ou tipo de classe).

a) friend void f1();

b) friend void f2( Ct1 & );

c) friend void C2::f3();

d) friend void Ct3::f4( Ct1 & );

e) friend da classe C4;

f) friend da classe Ct5;

Passo 1

Observe que a palavra-chave friend pode ser usada para permitir que outras classes ou outras funções declaradas fora do escopo de uma classe acessem seus membros de dados privados.

Dado o cabeçalho do modelo de classe

template class Ct1

e as seguintes definições

Ct são modelos de classe

T é o tipo de modelo

C são aulas.

f são funções

Para cada uma das seguintes declarações que podem ser colocadas dentro do modelo de classe Ct1, descreveremos a relação de amizade entre Ct1 e a função/classe externa definida.

Passo 2

  1. Amigo void f1();
  2. Ao colocar esta declaração dentro do modelo de classe Ct1, isso indica o seguinte relacionamento:

    A função f1 é amiga do modelo de classe Ct1.

    Para toda a especialização de modelo de classe criada a partir de Ct1, f1 pode acessar todos os seus membros de dados privados.

  3. amigo void f2( Ct1 & );
  4. Ao colocar esta declaração dentro do modelo de classe Ct1, isso indica o seguinte relacionamento:

    A função f2 é uma amiga do modelo de classe Ct1.

    Já que f2 aceita Ct1 como parâmetro. Isso implica que f2 só pode acessar os membros de dados privados da especialização de modelo de classe do tipo T fornecido.

    Por exemplo, se o tipo T fornecido for int, então f2 só poderá acessar os membros de dados privados da especialização de modelo de classe do tipo int. Os membros de dados privados de outras especializações de modelo de classe criadas a partir de Ct1 não estarão acessíveis para f2.

    Passo 3

  5. amigo void C2::f3();
  6. Ao colocar esta declaração dentro do modelo de classe Ct1, isso indica o seguinte relacionamento:

    A função f3 é uma função membro da classe C2 e é a única amiga do modelo de classe Ct1 nessa classe.

    Para toda a especialização de modelo de classe criada a partir de Ct1, f3 pode acessar todos os seus membros de dados privados.

  7. amigo void Ct3::f4( Ct1 & );
  8. Ao colocar esta declaração dentro do modelo de classe Ct1, isso indica o seguinte relacionamento:

    A função f4 é uma função membro do modelo de classe Ct3 e é a única amiga do modelo de classe Ct1 nessa classe.

    Já que f4 aceita Ct1 como parâmetro. Isso implica que f4 só pode acessar os membros de dados privados da especialização de modelo de classe do tipo T fornecido.

    Por exemplo, se o tipo T fornecido for char, então f4 só poderá acessar os membros de dados privados da especialização de modelo de classe do tipo char. Os membros de dados privados de outras especializações de modelo de classe criadas a partir de Ct1 não estarão acessíveis para f4.

    Passo 4

  9. classe amiga C4;
  10. Ao colocar esta declaração dentro do modelo de classe Ct1, isso indica o seguinte relacionamento:

    A classe C4 é uma amiga do modelo de classe Ct1. Isso indica que todas as funções membro da classe C4 são amigas de Ct1.

    Para toda a especialização de modelo de classe criada a partir de Ct1, todas as funções de membro da classe C4 podem acessar todos os seus membros de dados privados.

  11. classe amiga Ct5;

Ao colocar esta declaração dentro do modelo de classe Ct1, isso indica o seguinte relacionamento:

O modelo de classe Ct5 do tipo T é amigo do modelo de classe Ct1.

A especialização de modelo de classe do tipo T que é criada a partir de Ct5 é amiga da especialização de modelo de classe do mesmo tipo T criada a partir de Ct1. Isso indica que todas as funções de membro da especialização de modelo de classe Ct5 são amigas da especialização de modelo de classe Ct1.

Por exemplo, se o tipo T for double, então todas as funções de membro de Ct5 podem acessar os membros de dados privados de Ct1. Os membros de dados privados de outra especialização de modelo de classe como Ct1 não estarão acessíveis para as funções de membro de Ct5.

Resposta

Ver o desenvolvimento.