Tornar as classes públicas para outras classes em C++

Se eu tiver duas classes, por exemplo, como se segue:

class A {...}

class B {...}
Se eu quiser tornar a classe pública à classe, publico os membros da classe ou posso usar apenas o public class A {...}?

Por exemplo, só a classe {[1] } é pública para si? Por outras palavras, posso tornar as classes públicas protegidas ou privadas para os outros? Ou, isto é apenas uma questão de derivar uma classe (herança)?

Obrigado.

 8
Author: Simplicity, 2011-01-25

3 answers

Há uma diferença substancial entre tornar a classe pública e tornar o seu conteúdo público.

Se definir a sua classe num ficheiro de inclusão (.h file) então você está tornando sua classe pública. Cada outro arquivo fonte que inclui este arquivo de inclusão vai saber sobre esta classe, e pode, por exemplo, ter um ponteiro para ele.

A única maneira de tornar uma classe privada, é colocar a sua definição numa fonte (.ficheiro cpp).

Mesmo quando se torna uma aula pública, não se faz tem de tornar o conteúdo da sua turma público. O exemplo seguinte é um extremo:
class MyClass
   {
   private:
      MyClass();
      ~MyClass();
      void setValue(int i);
      int getValue() const;
   };

Se esta definição for colocada num ficheiro de inclusão, todas as outras fontes podem referir-se (ter um ponteiro) a esta classe, mas como todos os métodos da classe são privados, nenhuma outra fonte pode construí-la, destruí-la, definir o seu valor ou obter o seu valor.

Torna público o conteúdo de uma classe, colocando os seus métodos na parte "pública" da definição de classe, como isto:
class MyClass
   {
   public:
      MyClass();
      ~MyClass();
      int getValue() const;
   private:
      void setValue(int i);
   };
Agora todos podem construir e destruir instâncias desta classe, e podem até obter o valor. Definir o valor no entanto, não é público, então ninguém é capaz de definir o valor (exceto a própria classe).

Se você quer tornar a classe pública para apenas alguma outra classe da sua aplicação, mas não para a aplicação completa, você deve declarar que a outra classe um amigo, por exemplo:

class SomeOtherClass;
class MyClass
   {
   friend SomeOtherClass;
   public:
      MyClass();
      ~MyClass();
      int getValue() const;
   private:
      void setValue(int i);
   };
Agora, outra classe pode aceder a todos os métodos privados da minha classe, por isso ... may call setValue to set the value of MyClass. Todas as outras classes ainda estão limitadas aos métodos públicos. Infelizmente, não há como em C++ tornar apenas uma parte da sua classe pública a um conjunto limitado de outras classes. Então, se você faz de outra classe um amigo, ele é capaz de acessar todos os métodos privados. Portanto, limite o número de amigos.
 17
Author: Patrick, 2011-01-25 11:12:10
Podes usar a amizade.
class A { friend class B; private: int x; };
class B { B() { A a; a.x = 0; // legal };
 3
Author: Puppy, 2011-01-25 10:57:05
Se B tem uma forte interdependência com A, sugiro que use uma classe aninhada. Felizmente, a classe aninhada pode ser protegida ou privada.
class A {
protected:
     // the class A::B is visible from A and its
     // inherited classes, but not to others, just
     // like a protected member.
     class B {
     public:
         int yay_another_public_member();
     };
public:
     int yay_a_public_member();
};
 3
Author: BatchyX, 2011-01-25 11:40:19