Soy bastante nuevo en C++, pero tengo entendido que una sentencia #include esencialmente solo volcará el contenido del archivo #incluido en la ubicación de esa declaración. Esto significa que si tengo un número de declaraciones '#include' y 'using' en mi archivo de cabecera, mi archivo de implementación puede simplemente #incluir el archivo de encabezado, y al compilador no le importará si no repito las otras declaraciones .¿Deberían repetirse las sentencias '#include' y 'using' tanto en el encabezado como en los archivos de implementación (C++)?
¿Qué pasa con las personas?
Mi principal preocupación es que si no repito las instrucciones '#include', 'using' y también 'typedef' (ahora que lo pienso), quita esa información del archivo en el que se usa, lo que podría generar confusión.
Estoy trabajando en pequeños proyectos en este momento en el que realmente no causará ningún problema, pero me imagino que en proyectos más grandes con más gente trabajando en ellos podría convertirse en un problema importante.
Un ejemplo es el siguiente:
ACTUALIZACIÓN: mis prototipos de las funciones de 'Unidad' tienen cuerda, ostream y StringSet entre sus tipos de retorno y parámetros - No estoy incluyendo cualquier cosa en mi archivo de cabecera que se utiliza sólo en el archivo de implementación.
//Unit.h
#include <string>
#include <ostream>
#include "StringSet.h"
using std::string;
using std::ostream;
class Unit {
public:
//public members with string, ostream and StringSet
//in their return values/parameter lists
private:
//private members
//unrelated side-question: should private members
//even be included in the header file?
} ;
//Unit.cpp
#include "Unit.h"
//The following are all redundant from a compiler perspective:
#include <string>
#include <ostream>
#include "StringSet.h"
using std::string;
using std::ostream;
//implementation goes here
Una pregunta sin relación que no quería complicar la pregunta principal es, ya que todos parecen decir que las declaraciones globales de 'uso' son una mala idea, ¿cómo puedo tener una clase 'usando std :: string' ¿o algo? Mover esa instrucción a la declaración de clase provoca un error de compilación porque no le gustan los espacios de nombres en una instrucción 'using' en esa ubicación. –
¿Qué hay de malo en decir explícitamente 'std :: string'? –
nada hasta que comienza a causar que las líneas se rompan cuando de otro modo no lo harían, lo que reduce la legibilidad. Alejémonos un poco de std :: por un tiempo y digamos que quería usar el nombre deLongestNamespeceName en TheKnownUniverse :: string - solo para evitar el mantra común 'siempre debería escribir std :: string' (ya que lo escuché muchas veces ya, y aunque es un punto válido, realmente no ayuda con la pregunta en cuestión). –