Tengo un archivo de encabezado, llamado Person.h:

class Person
{
    public:
        Person();
    private:
        std::string name;
};

La implementación está en el archivo llamado Person.cpp:

#include <string>
#include "Person.h"

Person::Person()
{
    name = "foo";
}

Estoy acostumbrado a evitar los archivos de inclusión anidados, así que estoy #include - usando el encabezado <string> antes de incluir el encabezado de la clase en el archivo fuente de la clase.

Ahora esto no se compila con el error de que std::string no es un nombre definido. Pero si incluyo en el archivo de encabezado se compila.

En la web descubrí que incluir encabezados, prestar atención al orden de inclusión (que es lo que hago regularmente en C, mi lenguaje principal) debería funcionar (los archivos incluidos no se compilan por sí mismos sino que simplemente se insertan en el archivo fuente).

Entonces mi pregunta es, ¿por qué no se compila sin incluir el encabezado de cadena en el archivo de encabezado? Debido a que el archivo de encabezado se "copia y pega" en el archivo fuente después de #include <string>, espero que se compile bien.

0
Luca 29 dic. 2016 a las 21:47

3 respuestas

La mejor respuesta

Es mejor incluir todos los encabezados relevantes para su clase en el archivo de encabezado para esa clase. Elegir no hacerlo requiere que recuerdes incluir los encabezados necesarios en todos los demás archivos que usan tu clase, y a medida que agregues nuevas funcionalidades a tu clase y, por lo tanto, la necesidad de encabezados adicionales, debes visitar todos los lugares donde su encabezado de clase se ha incluido y agregue los encabezados adecuados a cada archivo.

1
Mikel F 29 dic. 2016 a las 19:13

El problema es que el encabezado debe incluir los encabezados para las definiciones de tipo en las que se basa, o los tipos de declaración directa para los que solo necesita un puntero como referencia.

Mueva la inclusión de <string.h> a su archivo de encabezado para solucionar este problema.

No necesita preocuparse por las inclusiones múltiples, porque todos los encabezados estándar usan Protectores de inclusión . También debe agregar protectores de inclusión a sus propios encabezados.

[la necesidad de ver las declaraciones hacia adelante es] lo mismo en C. Pero debería obtenerlas del archivo de encabezado incluido antes en el archivo cpp.

Parece que hay otros lugares desde los que incluye el archivo de encabezado Person.h, además de Person.cpp. Esto es lo que desencadena el error.

3
Community 23 may. 2017 a las 12:33

Desea usar, como los archivos de encabezado estándar y todos los demás, incluye guardias

#ifndef PERSON_H
#define PERSON_H

/// your header file

#endif // PERSON_H
0
Paul Evans 29 dic. 2016 a las 18:52