2011-01-25 4 views
7

Si j'ai deux classes par exemple comme suit:Faire des classes publiques à d'autres classes en C++

class A {...} 

class B {...} 

Si je veux faire la classe A publique à la classe B, que je viens de faire les membres du public classe A ou je peux simplement utiliser public class A {...}?

Existe-t-il un moyen de dire à la classe B par exemple que seule la classe A est publique pour vous? En d'autres termes, puis-je rendre les cours publics à A protégés ou privés à d'autres? Ou, c'est juste une question de dériver une classe (héritage)?

Merci.

+2

vous devriez prendre un bon livre C++. Il y a beaucoup de fils SO qui vous en conseilleront un. –

Répondre

15

Il existe une différence substantielle entre rendre la classe publique et rendre son contenu public.

Si vous définissez votre classe dans un fichier d'inclusion (fichier .h), vous rendez votre classe publique. Tous les autres fichiers sources qui incluent ce fichier include connaissent cette classe et peuvent, par exemple, avoir un pointeur.

La seule façon de rendre une classe privée, c'est de mettre sa définition dans un fichier source (.cpp).

Même lorsque vous créez un cours public, vous n'avez pas nécessairement à rendre public le contenu de votre classe. L'exemple suivant est un cas extrême un:

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

Si cette définition est placée dans un fichier Include, toutes les autres sources peut se référer à (un pointeur) cette classe, mais comme toutes les méthodes de la classe sont privées , aucune autre source ne peut le construire, le détruire, définir sa valeur ou obtenir sa valeur.

Vous faites le contenu d'un public de classe en mettant les méthodes de celui-ci dans la partie « public » de la définition de classe, comme ceci:

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

Maintenant tout le monde peut construire et détruire les instances de cette classe, et peut même avoir la valeur. La définition de la valeur n'est cependant pas publique, donc personne n'est capable de définir la valeur (sauf la classe elle-même).

Si vous voulez faire le public de classe seulement une autre classe de votre demande, mais pas à l'application complète, vous devez déclarer cette autre classe un ami, par exemple:

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

Maintenant, SomeOtherClass peut accéder à toutes les méthodes privées de MyClass, donc il peut appeler setValue pour définir la valeur de MyClass. Toutes les autres classes sont encore limitées aux méthodes publiques.

Malheureusement, il n'y a aucun moyen en C++ de ne rendre publique qu'une partie de votre classe à un ensemble limité d'autres classes. Donc, si vous faites d'une autre classe une amie, elle peut accéder à toutes les méthodes privées. Par conséquent, limitez le nombre d'amis.

+0

Lorsque vous écrivez: 'int getValue() const;', est-ce que 'const' signifie ici: retourne la valeur comme une constante? Merci. – Simplicity

+1

Le paramètre const signifie que la méthode ne changera pas l'instance elle-même, donc getValue ne changera pas l'instance de MyClass sur laquelle vous appelez getValue. En général, une valeur de retour const (comme dans "const int getValue();") n'a pas de sens. Ce qui est logique, c'est que si vous renvoyez un pointeur, le pointeur pointe vers une valeur const (comme dans "const char * getName()"). – Patrick

3

Vous pouvez utiliser l'amitié.

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

@DeadMG. Est-ce une autre forme d'amitié: "classe B: public A"? Merci. – Simplicity

+0

@ user588855, non, c'est [héritage] (http://www.cplusplus.com/doc/tutorial/inheritance/). –

+0

@DeadMG. Alors, comment pouvons-nous faire une classe publique? Est-ce correct en utilisant le mot-clé "public" avant le nom de la classe? – Simplicity

3

Si B a une forte interdépendance avec A, je vous suggère d'utiliser une classe imbriquée. Heureusement, la classe imbriquée peut être protégée ou privée.

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