/ / C ++ Utilisation d'une classe dans une classe - c ++

C ++ Utiliser une classe dans une classe - c ++

J'ai une question fondamentale qui me préoccupe depuis un certain temps.

Lors de l'utilisation d'une classe dans une classe, je peux définirl'en-tête de la classe que je veux utiliser dans le fichier d'en-tête. J'ai vu deux façons de faire cela et aimerais connaître la différence entre les deux méthodes?

ex1

#include "ClassA.h"

class ClassB {

public:
ClassB();
~ClassB();
ClassA* a;
};
#endif

ex2 Voici l'autre manière de le faire. L'en-tête ClassA serait défini dans le fichier source ClassB.

class ClassA;

class ClassB {

public:
ClassB();
~ClassB();
ClassA* a;
};
#endif

Quelles sont les différences avec ces deux méthodes?

Réponses:

9 pour la réponse № 1

La mise en page complète du classA est connu du compilateur lorsque vous incluez la définition de la classe.

La deuxième syntaxe s'appelle Déclaration à terme et maintenant classA est un Type incomplet pour le compilateur.

Pour un type incomplet,
Vous pouvez:

  • Déclarez un membre comme étant un pointeur ou une référence au type incomplet.
  • Déclarez des fonctions ou des méthodes acceptant / renvoyant des types incomplets.
  • Définir des fonctions ou des méthodes qui acceptent / renvoient des pointeurs / références au type incomplet (mais sans utiliser ses membres)

Mais tu ne peux pas:

  • Utilisez-le comme classe de base.
  • Utilisez-le pour déclarer un membre.
  • Définissez des fonctions ou des méthodes utilisant ce type.
  • Utilisez ses méthodes ou ses champs, en essayant en fait de déréférencer une variable de type incomplet.

Alors avant Déclarer la classe pourrait travailler plus vite,parce que le compliant n'a pas besoin d'inclure le code complet dans ce fichier d'en-tête, mais cela restreint l'utilisation du type, puisqu'il devient un type incomplet.


1 pour la réponse № 2

La seconde méthode vous permet uniquement de créer des pointeurs sur ClassA, car sa taille est inconnue. Elle peut toutefois être compilée plus rapidement car l’en-tête de la définition complète de ClassA n’est pas inclus.


0 pour la réponse № 3

Ce dernier est une déclaration anticipée. De cette façon, vous pouvez déclarer un pointeur ou une référence à une classe, même si vous ne l'avez pas encore complètement déclaré. Ceci peut être utilisé pour résoudre les dépendances cycliques. Et si, dans votre premier exemple, A veut également utiliser un pointeur pour B. Cela ne fonctionnerait pas, car quand A est déclaré, B n'est pas encore connu. Pour résoudre ce problème, vous pouvez utiliser une déclaration forward pour indiquer au compilateur qu'il existe une classe. Bet vous lui direz plus tard à quoi ça ressemble.