Me gusta poner todas mis #incluye en mi archivo de encabezado, a continuación, incluir sólo mi cabecera para que el archivo de origen en mi archivo de origen. ¿Cuál es el estándar de la industria? Hay retrocesos para mi método?

1 Comentario

  1. 65

    Por lo general, sólo quiero poner el mínimo necesario incluye en un archivo de encabezado de clase, como cualquier otra persona que use el encabezado será obligado a #include todos ellos demasiado. En proyectos más grandes, esto conduce hacia más lento construye, de los problemas de dependencia, y todo tipo de maldad de otra índole.

    Pensar en un archivo de encabezado como la interfaz pública de la clase. Usted no quiere a la silla todo el que lo usa con extra de las dependencias, a menos que los necesario a ser capaz de utilizar la clase.

    Mover nada de lo que solo es necesario en la implementación de la clase hacia abajo en el archivo de origen. Para otras clases que se utilizan en un encabezado, sólo #include sus encabezados, si usted realmente necesita saber su tamaño o contenido en el encabezado – nada más y declaración forward es suficiente. La mayoría de los casos, sólo se necesita #include clases que estamos heredando, y clases cuyos objetos de valor de los miembros de su clase.

    Esta página tiene un buen resumen. (Replica de abajo para referencia)


    C++ Archivo De Encabezado Incluyen Patrones De #

    Grandes proyectos de software requieren un cuidadoso encabezado de la gestión de archivos incluso cuando la programación en C. Cuando los desarrolladores de pasar a C++, archivo de encabezado de la gestión se vuelve aún más complejo y requiere mucho tiempo. Aquí te presentamos algunos de encabezado de archivo de inclusión de los patrones que te facilitarán esta tarea.

    Encabezado De Archivo De Reglas De Inclusión

    Aquí, hablamos de las reglas básicas de C++ archivo de encabezado de la inclusión necesarias para simplificar el archivo de encabezado de la gestión.

    Un archivo de encabezado deben ser incluidas sólo cuando un delantero declaración de no hacer el trabajo.
    El archivo de encabezado debe estar diseñado de manera que el orden de archivo de encabezado de la inclusión no es importante.
    Esto se logra asegurándose de que x.h es el primer archivo de encabezado en x.cpp
    El archivo de encabezado de la inclusión mecanismo debe ser tolerante a duplicar el archivo de encabezado de inclusiones.
    Las siguientes secciones se explican estas reglas con la ayuda de un ejemplo.

    Archivo De Encabezado De La Inclusión Ejemplo

    El siguiente ejemplo ilustra los diferentes tipos de dependencias. Asumir una clase con Un código almacenado en a.cpp y a.h.

    a.h

    #ifndef _a_h_included_
    #define _a_h_included_
    #include "abase.h"
    #include "b.h"
    
    //Forward Declarations
    class C;
    class D;
    
    class A : public ABase
    {
      B m_b;
      C *m_c;
      D *m_d;
    
    public:
      void SetC(C *c);
      C *GetC() const;
    
      void ModifyD(D *d);
    };
    #endif

    a.cpp

    #include "a.h"
    #include "d.h"
    
    void A::SetC(C* c)
    {
      m_c = c;
    }
    
    C* A::GetC() const
    {
      return m_c;
    }
    
    void A::ModifyD(D* d)
    {
      d->SetX(0);
      d->SetY(0);
      m_d = d;
    }

    Archivo De Inclusión Análisis

    Permite analizar el archivo de encabezado de inclusiones, desde el punto de vista de las clases implicadas en este ejemplo, es decir,ABase, A, B, C y D.

    • Clase Humillar: ABase es la clase base, por lo que la declaración de la clase es necesario para completar la declaración de la clase. El compilador necesita saber el tamaño de ABase para determinar el tamaño total de A. En este caso abase.h debe ser incluida explícitamente en a.h.
    • Clase B: Clase A contiene la Clase B por valor , por lo que la declaración de la clase es necesario para completar la declaración de la clase. El compilador necesita saber el tamaño de B para determinar el tamaño total de A. En este caso b.h debe ser incluida explícitamente en a.h.
    • Clase C: Class C se incluye sólo como una referencia a un puntero. El tamaño o el contenido real de C no son importantes para a.h o a.cpp. Por lo tanto sólo una declaración forward ha sido incluido en a.h. Observe que c.h no ha sido incluida en a.h o a.cpp.
    • Clase D: Clase D es utilizado como una referencia a un puntero en a.h. Por lo tanto una declaración forward es suficiente. Pero a.cpp utiliza la clase D en sustancia, por lo que incluye explícitamente d.h.

    Puntos Clave

    Archivos de encabezado deben ser incluidas sólo cuando un delantero declaración de no hacer el trabajo. Por no incluidos c.h y d.h otros clientes de clase A nunca tiene que preocuparse de c.h y d.h a menos que el uso de la clase C y D por valor.
    a.h ha sido incluido como el primer archivo de encabezado en a.cpp Esto se asegurará de que a.h no esperar una cierta archivos de encabezado para ser incluidos antes de a.h. Como a.h ha sido incluido como el primer archivo, la compilación exitosa de a.cpp se asegurará de que a.h no se espera que ningún otro archivo de encabezado para ser incluidos antes de a.h.
    Si esto es seguido por todas las clases, (es decir, x.cpp siempre incluye x.h como el primer encabezado), no habrá ninguna dependencia en el archivo de encabezado de la inclusión.
    a.h incluye la verificación de preprocesador definición de símbolo _a_h_included_. Esto hace que sea tolerante a duplicar inclusiones de a.h.

    Cíclico De Dependencia

    Cíclico existe una dependencia entre la clase X y Y en el siguiente ejemplo. Esta dependencia es manejado mediante declaraciones forward.

    x.h and y.h

    /* ====== x.h ====== */
    //Forward declaration of Y for cyclic dependency
    class Y;
    
    class X 
    {
        Y *m_y;
        ...
    };
    
    /* ====== y.h ====== */
    //Forward declaration of X for cyclic dependency
    class X;
    
    class Y 
    {
        X *m_x;
        ...
    };
    • Esta Página realmente buena.. gracias por la publicación.
    • Y también las enumeraciones que dependen puesto que usted no puede declarar hacia delante de ellos.
    • «Esta página» ahora requiere un inicio de sesión y una contraseña…
    • gracias por el headsup, he replicado en la respuesta misma.

Dejar respuesta

Please enter your comment!
Please enter your name here