11
votes

Faire des cours publiques à d'autres classes en C ++

Si j'en ai deux classes, par exemple comme suit: xxx

si je veux faire de la classe a public en classe B , est-ce que je viens de faire les membres de la classe a public ou je peux simplement utiliser class public A {...} ?

Y a-t-il un moyen de Classe de rachat B par exemple que seule la classe A est public pour vous? En d'autres termes, puis-je faire des classes publiques à A protégées ou privées à d'autres? Ou, il s'agit simplement d'une question de dérivation d'une classe (héritage)?

Merci.


1 commentaires

Vous devriez attraper un bon livre C ++. Il y a beaucoup de threads qui vous informeront un.


3 Réponses :


3
votes

Vous pouvez utiliser l'amitié. XXX


14 commentaires

@Deadmg. Est-ce une autre forme pour l'amitié: "Classe B: public a"? Merci.


@ user588855, non, c'est héritage .


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


@ user588855, en C ++, il n'y a pas de restrictions d'accessibilité pour les classes (par exemple par ex. Java ou C #), uniquement pour les membres de la classe. Donc classe publique x {...}; n'est pas valide C ++. Une classe est visible pour une autre classe si vous #import son fichier d'en-tête.


Comme Deadmg vous l'a dit. Non, écrire public avant que le mot-clé de classe ne soit pas C ++.


@ Péter Török. Lorsque vous dites: «Une classe est visible pour une autre classe si vous # Importez son fichier d'en-tête», qu'est-ce qui est "visible" ici? Je veux dire sera-t-il "public" ou "protégé"? Ou cela dépend des spécificateurs accessoires des membres de la classe uniquement? Merci.


@ user588855, en termes Java, toutes les classes C ++ sont publiques par défaut et vous n'avez aucun moyen de changer cela.


Tout comme un peu de côté, si vous voulez simplement faire tout public, vous pouvez en faire une structure au lieu d'une classe. L'une des nombreuses différences entre une classe et une structure est le spécificateur d'accès par défaut pour les membres. Mais oui, si vous souhaitez rendre les membres accessibles à une classe spécifique, alors vous avez besoin d'amitié.


@ Péter Török. Vous avez ce que vous voulez dire, merci beaucoup et merci à vous tous pour vos réponses.


@ Péter Török, lorsque User588855 dit classe publique, je pense qu'il / elle fait référence à l'accessibilité des membres de la classe.


@qui. Alors, les "structs" peuvent-elles contenir des fonctions? Merci.


@ user588855 Oui, les structures peuvent contenir également des fonctions de membre, même des constructeurs virtuels, des surcharges de l'opérateur et de l'ensemble du shebang.


@ user588855, @wich, techniquement oui, toutefois, la Convention courante C ++ est d'utiliser des structures uniquement comme des classes de données stupides, c'est-à-dire aucune logique. Si vous avez besoin de la logique associée à vos données, vous souhaitez toujours toujours l'encapsulation aussi, vous devez donc le déclarer une classe (où l'accès par défaut est privé ).


@ Péter Török #import ne fait pas partie de la norme C ++.



20
votes

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

Si vous définissez votre classe dans un fichier Inclure (.h Fichier), vous faites votre classe. Tous les autres fichiers source qui incluent ce fichier incluent au sujet de cette classe et de PA. avoir un pointeur à celui-ci. p>

Le seul moyen de faire une classe privée, de mettre sa définition dans un fichier source (.CPP). p>

même lorsque vous faites une classe publique , vous n'avez pas nécessairement besoin de faire le contenu de votre classe publique. L'exemple suivant est un exemple extrême: p> xxx pré>

si cette définition est placée dans un fichier incluant, toutes les autres sources peuvent faire référence à (avoir un pointeur à) cette classe, mais depuis que 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. P>

Vous faites le contenu d'une classe publique en mettant les méthodes de la " Partie publique de la définition de la classe, comme celle-ci: p> xxx pré>

maintenant Tout le monde peut construire et détruire des instances de cette classe et peut même obtenir la valeur. Définir la valeur cependant, n'est pas public, de sorte que personne ne puisse définir la valeur (à l'exception de la classe elle-même). P>

Si vous souhaitez rendre la classe publique uniquement à une autre catégorie de votre application, mais pas à l'application complète, vous devriez déclarer que d'autres amis de classe A, par exemple: p>

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


2 commentaires

Lorsque vous écrivez: int getvalue () const; , est-ce que const ici signifie ici: renvoyer la valeur comme une constante? Merci.


Le const signifie que la méthode ne changera pas l'instance elle-même, alors GetValue ne changera pas l'instance de MyClass sur laquelle vous appelez GetValue. En général, une valeur de retour de const (comme dans "const int getvalue ();") n'a pas de sens. Ce qui a du sens, c'est si vous retournez un pointeur, que le pointeur pointe vers une valeur de const (comme dans «Cons-Char * GetName ()»).



3
votes

Si B a une forte interdépendance à 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();
};


0 commentaires