2011-01-25 31 views
7

Se ho due classi, ad esempio come segue:classi Rendere pubbliche ad altre classi in C++

class A {...} 

class B {...} 

Se voglio fare classe A pubblico alla classe B, posso solo fare i membri della classe A pubblico o posso semplicemente usare public class A {...}?

C'è un modo per dire alla classe B ad esempio che solo la classe A è pubblica per te? In altre parole, posso rendere pubbliche le classi a A protette o private ad altri? Oppure, si tratta solo di derivare una classe (eredità)?

Grazie.

+2

si dovrebbe prendere un buon libro C++. Ci sono molti thread SO che ti consiglieranno. –

risposta

15

C'è una differenza sostanziale tra rendere la classe pubblica e rendere pubblici i suoi contenuti.

Se si definisce la classe in un file di inclusione (file .h), si rende pubblica la classe. Ogni altro file sorgente che include questo file include saprà di questa classe e può ad es. avere un puntatore ad esso.

L'unico modo per rendere privata una classe, è mettere la sua definizione in un file sorgente (.cpp).

Anche quando rendi pubblico un corso, non devi necessariamente rendere pubblico il contenuto della tua classe. L'esempio che segue è un estremo uno:

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

Se questa definizione viene messo in un file di inclusione, ogni altra fonte può fare riferimento a (avere un puntatore a) questa classe, ma dal momento che tutti i metodi della classe sono privati nessuna altra fonte può costruirlo, distruggerlo, impostare il suo valore o ottenere il suo valore.

a fare la contenuto di una classe pubblica mettendo metodi da esso nella parte 'pubblica' della definizione della classe, come questo:

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

Ora tutti possono costruire e distruggere le istanze di questa classe, e potrebbe anche ottenere il valore. L'impostazione del valore tuttavia non è pubblica, quindi nessuno è in grado di impostare il valore (tranne la classe stessa).

Se si vuole fare il pubblico di classe per solo qualche altra classe della vostra applicazione, ma non per l'applicazione completa, si dovrebbe dichiarare che altra classe un amico, ad esempio:

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

Ora, SomeOtherClass maggio accedi a tutti i metodi privati ​​da MyClass, quindi può chiamare setValue per impostare il valore di MyClass. Tutte le altre classi sono ancora limitate ai metodi pubblici.

Sfortunatamente, non c'è modo in C++ di rendere solo una parte della classe pubblica in un insieme limitato di altre classi. Quindi, se fai diventare un'altra classe un amico, è in grado di accedere a tutti i metodi privati. Pertanto, limitare il numero di amici.

+0

Quando scrivete: 'int getValue() const;', 'const 'qui significa: restituisce il valore come costante? Grazie. – Simplicity

+1

Il const indica che il metodo non cambierà l'istanza stessa, quindi getValue non cambierà l'istanza di MyClass su cui chiamate getValue. In generale, un valore di ritorno const (come in "const int getValue();") non ha senso. Ciò che ha senso è che se si restituisce un puntatore, il puntatore punta a un valore const (come in "const char * getName()"). – Patrick

3

È possibile utilizzare l'amicizia.

+0

@DeadMG. Questa è un'altra forma di amicizia: "classe B: pubblico A"? Grazie. – Simplicity

+0

@ user588855, no, cioè [ereditarietà] (http://www.cplusplus.com/doc/tutorial/inheritance/). –

+0

@DeadMG. Quindi, come possiamo fare una lezione pubblica? È corretto utilizzando la parola chiave "public" prima del nome della classe? – Simplicity

3

Se B ha una forte interdipendenza con A, suggerisco di utilizzare una classe annidata. Fortunatamente, la classe nidificata può essere protetta o privata.

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(); 
}; 
Problemi correlati