c++ include software-design

c++ - ¿Debo repetir inclusiones en.cpp y.h?



include software-design (4)

Guión:

foo.h:

#include <vector> class foo { public: std::vector<int>* getVector(); /* ... other methods declarations ... */ }

foo.cpp:

#include "foo.h" #include <vector> /* ... other methods definitions using std::vector ... */ std::vector<int>* foo::getVector() { return new std::vector<int>(); }

Quiero que .cpp sea independiente de cualquier posible cambio futuro en el encabezado. Si por alguna razón la interfaz de la clase cambia y la dependencia de <vector> puede eliminarse, me arriesgo a que otros métodos en .cpp también pierdan esa inclusión.

¿Es correcto repetir la inclusión de <vector> tanto en .cpp como en .h? ¿Tiene sentido esta práctica o debería simplemente confiar en las inclusiones hechas en el encabezado?


En el archivo .cpp, es suficiente incluir solo cosas específicas para la implementación (qué archivo .cpp de hecho es), sin repetir cosas que ya incluiste en el encabezado. De esta forma, cuando alguien está mirando tu código, también obtiene una mejor y más clara comprensión de tu código.

Puede ser muy útil saber qué dependencias son específicas solo para la implementación, por ejemplo, cuando estás actualizando / reemplazando con otra (preservando la interfaz).


Incluya la menor cantidad posible de archivos en el encabezado y solo los incluya en los archivos .cpp que los necesitan. Su archivo de encabezado foo.h podría incluirse en muchos otros archivos .cpp que no necesitan las declaraciones de los otros archivos de encabezado (en este caso, vector.h), que a la larga conducen a compilaciones más largas y menos claras. código.


Incluye lo que necesitas y nada más.

Incluir el mismo archivo de encabezado en múltiples archivos .h y múltiples archivos .cpp no ​​es un problema en sí mismo. Las protecciones de encabezado son efectivas para mitigar los problemas al incluir archivos varias veces.

Si comienza a tratar de evitar incluir el mismo archivo varias veces, en realidad puede ser negativo, ya que generalmente lo lleva a un "archivo megaincluido" que incluye todo lo que necesita en todo el proyecto. Esto es malo, porque un cambio a cualquier archivo de encabezado hace que todo vuelva a compilarse.

Si le preocupa que un archivo .h / .cpp incluya el mismo archivo, siga estas instrucciones:

  • Si la inclusión no es necesaria en el archivo de encabezado, solo incluirlo en el CPP
  • Si se necesita una declaración de clase en el archivo de encabezado (pero no se usa), use la declaración de reenvío en el archivo .h e inclúyalo en el archivo CPP.
  • Si realmente usa el include en el archivo de encabezado, inclúyalo en el archivo de encabezado y no en el CPP.

No, no deberías. No sirve para nada. Las líneas redundantes cuestan sin beneficio.

Cada archivo debe incluir lo que necesita y no más. En su caso específico de un encabezado y su implementación, la declaración redundante en .cpp no ​​ayuda. Si el encabezado cambia lo suficiente como para que la función ya no necesite devolver un vector, necesitaría volver a visitar el .cpp de todos modos.