"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo manejar las dependencias circulares entre encabezados en C++?

¿Cómo manejar las dependencias circulares entre encabezados en C++?

Publicado el 2024-11-12
Navegar:178

 How to Handle Circular Dependencies Between Headers in C  ?

Encabezados que se incluyen entre sí en C

En C, ocasionalmente es necesario que los encabezados se incluyan entre sí. Sin embargo, esto puede generar problemas, especialmente cuando se trata de dónde colocar las declaraciones #include.

Macros internas o externas

En general, las declaraciones #include deben colocarse dentro de macros, como #ifndef include guards. Esto evita la recursividad infinita durante la compilación, como se demuestra en el siguiente ejemplo:

// A.h
#ifndef A_H_
#define A_H_

#include "B.h"

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_

Colocar las declaraciones #include fuera de las macros da como resultado que el compilador recurra indefinidamente debido a la inclusión mutua entre A.h y B.h.

Tipos no declarados

Sin embargo, colocar las declaraciones #include dentro de las macros puede generar problemas con tipos no declarados. Por ejemplo, considere el siguiente código:

// A.h
#ifndef A_H_
#define A_H_

class A;  // Forward declaration

#include "B.h"

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;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_

En este caso, el compilador se quejará de que A es un tipo no declarado dentro de B.h. Esto se debe a que la declaración directa en A.h no es visible cuando se incluye B.h.

Solución: declaraciones directas

Para resolver estos problemas, es mejor utilizar declaraciones directas e incluya el encabezado que contiene la definición completa cuando sea necesario. En este ejemplo, se debe agregar una declaración directa de A a B.h antes de la definición de B:

// B.h
#ifndef B_H_
#define B_H_

class A;  // Forward declaration

#include "A.h"

class B {
    private:
        A a;  // Directly include A
    public:
        B(A& a) : a(a) {}
};

#endif // B_H_
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3