Maison >développement back-end >C++ >Comment gérer les dépendances d'en-tête circulaire en C lorsque les classes se référencent les unes les autres ?

Comment gérer les dépendances d'en-tête circulaire en C lorsque les classes se référencent les unes les autres ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-26 12:25:29474parcourir

How to Handle Circular Header Dependencies in C   When Classes Reference Each Other?

En-têtes s'incluant les uns les autres en C

Lors de la création de code en C où les classes se référencent les unes les autres, il est crucial de gérer de manière appropriée l'inclusion de l'en-tête fichiers.

Inclure le placement des instructions

Par défaut, les fichiers d'en-tête sont inclus dans les macros (gardes #ifndef) pour éviter une récursion infinie si les en-têtes se référencent les uns les autres. Dans l'exemple fourni, placer les instructions #include à l'intérieur des macros résout le problème où chaque classe inclut l'en-tête de l'autre.

Déclarations Forward

Dans la situation décrite, le Le compilateur rencontre la définition de la classe B avant la classe A à laquelle il fait référence. Pour résoudre ce problème, une déclaration directe de A est requise avant la définition de la classe B :

<code class="c++">class A;  // Declare A's existence</code>

Cela informe le compilateur que A est une classe, sans avoir besoin de sa définition complète à ce stade.

Code révisé

Voici le code révisé intégrant à la fois la déclaration directe et l'inclusion de la macro interne :

<code class="c++">// A.h
#ifndef A_H_
#define A_H_

#include "B.h"

class A; // Forward declaration

class A
{
    private:
        B b;

    public:
        A() : b(*this) {}
};

#endif /*A_H_*/

// B.h
#ifndef B_H_
#define B_H_

#include "A.h"

class B
{
    private:
            A& a;

    public:
        B(A& a) : a(a) {}
 };

#endif /*B_H_*/</code>

En suivant ces directives, les classes peuvent faire référence à chaque autre correctement, évite les erreurs de compilation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn