2011-01-25 16 views
7

Si tengo dos clases, por ejemplo, de la siguiente manera:clases de decisiones públicas a otras clases en C++

class A {...} 

class B {...} 

Si quieren hacer la clase A pública a la clase B, me acaba de hacer los miembros de la clase A pública o simplemente puedo usar public class A {...}?

¿Hay alguna manera de decirle a la clase B por ejemplo que solo la clase A es pública para usted? En otras palabras, ¿puedo hacer públicas las clases a A protegidas o privadas para terceros? ¿O solo se trata de derivar una clase (herencia)?

Gracias.

+2

deberías tomar un buen libro de C++. Hay muchos hilos SO que te aconsejarán. –

Respuesta

15

Hay una diferencia sustancial entre hacer pública la clase y hacer público su contenido.

Si define su clase en un archivo de inclusión (archivo .h), entonces hará que su clase sea pública. Todos los demás archivos fuente que incluyen este archivo de inclusión sabrán sobre esta clase, y pueden, p. tener un puntero a eso.

La única manera de hacer que una clase sea privada, es poner su definición en un archivo fuente (.cpp).

Incluso cuando haces una clase pública, no necesariamente tienes que hacer público el contenido de tu clase. El siguiente ejemplo es un extremo una:

class MyClass 
    { 
    private: 
     MyClass(); 
     ~MyClass(); 
     void setValue(int i); 
     int getValue() const; 
    }; 

Si esta definición se pone en un archivo de inclusión, todas las otras fuentes se puede referir a (tener un puntero a) de esta clase, pero como todos los métodos de la clase son privadas , ninguna otra fuente puede construirlo, destruirlo, establecer su valor o obtener su valor.

Se crea el contenido de un público de clase poniendo métodos de él en la parte 'pública' de la definición de clase, así:

class MyClass 
    { 
    public: 
     MyClass(); 
     ~MyClass(); 
     int getValue() const; 
    private: 
     void setValue(int i); 
    }; 

Ahora todo el mundo puede construir y destruir instancias de esta clase, y incluso puede obtener el valor. Sin embargo, establecer el valor no es público, por lo que nadie puede establecer el valor (excepto la clase misma).

Si desea hacer pública la clase sólo a alguna otra clase de su aplicación, pero no a la aplicación completa, debe declarar que otra clase de un amigo, por ejemplo:

class SomeOtherClass; 
class MyClass 
    { 
    friend SomeOtherClass; 
    public: 
     MyClass(); 
     ~MyClass(); 
     int getValue() const; 
    private: 
     void setValue(int i); 
    }; 

Ahora, SomeOtherClass puede acceda a todos los métodos privados de MyClass, por lo que puede llamar a setValue para establecer el valor de MyClass. Todas las otras clases todavía están limitadas a los métodos públicos.

Desafortunadamente, no hay forma en que C++ haga pública solo una parte de su clase a un conjunto limitado de otras clases. Entonces, si haces que otra clase sea un amigo, puede acceder a todos los métodos privados. Por lo tanto, limite el número de amigos.

+0

Cuando escribe: 'int getValue() const;', ¿significa 'const' aquí: devolver el valor como una constante? Gracias. – Simplicity

+1

La const significa que el método no cambiará la instancia en sí misma, por lo que getValue no cambiará la instancia de MyClass a la que llama getValue. En general, un valor de retorno const (como en "const int getValue();") no tiene sentido. Lo que sí tiene sentido es devolver un puntero, que el puntero apunta a un valor const (como en "const char * getName()"). – Patrick

3

Puede usar la amistad.

class A { friend class B; private: int x; }; 
class B { B() { A a; a.x = 0; // legal }; 
+0

@DeadMG. ¿Es esta otra forma de amistad: "clase B: pública A"? Gracias. – Simplicity

+0

@ user588855, no, eso es [inheritance] (http://www.cplusplus.com/doc/tutorial/inheritance/). –

+0

@DeadMG. Entonces, ¿cómo podemos hacer una clase pública? ¿Es correcto usar la palabra clave "público" antes del nombre de la clase? – Simplicity

3

Si B tiene una fuerte interdependencia con A, le sugiero que use una clase anidada. Afortunadamente, la clase anidada puede ser protegida o 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(); 
}; 
Cuestiones relacionadas