c++ - programa - incluir header en c
C++, cómo declarar una estructura en un archivo de cabecera (7)
C ++, cómo declarar una estructura en un archivo de encabezado:
Pon esto en un archivo llamado main.cpp:
#include <cstdlib>
#include <iostream>
#include "student.h"
using namespace std; //Watchout for clashes between std and other libraries
int main(int argc, char** argv) {
struct Student s1;
s1.firstName = "fred"; s1.lastName = "flintstone";
cout << s1.firstName << " " << s1.lastName << endl;
return 0;
}
poner esto en un archivo llamado student.h
#ifndef STUDENT_H
#define STUDENT_H
#include<string>
struct Student {
std::string lastName, firstName;
};
#endif
Compilarlo y ejecutarlo, debe producir esta salida:
s1.firstName = "fred";
Protip:
No debe colocar un using namespace std;
directiva en el archivo de encabezado C ++ porque puede causar conflictos de nombres silenciosos entre diferentes bibliotecas. Para remediar esto, use el nombre completamente calificado: std::string foobarstring;
en lugar de incluir el espacio de nombres std con string foobarstring;
.
He intentado incluir una estructura llamada "estudiante" en un archivo student.h
, pero no estoy muy seguro de cómo hacerlo.
Mi código de archivo student.h
consiste completamente:
#include<string>
using namespace std;
struct Student;
mientras que el archivo student.cpp
consiste completamente:
#include<string>
using namespace std;
struct Student {
string lastName, firstName;
//long list of other strings... just strings though
};
Desafortunadamente, los archivos que usan #include "student.h"
presentan numerosos errores como
error C2027: use of undefined type ''Student''
error C2079: ''newStudent'' uses undefined struct ''Student'' (where newStudent is a function with a `Student` parameter)
error C2228: left of ''.lastName'' must have class/struct/union
Parece que el compilador (VC ++) no reconoce struct Student de "student.h"?
¿Cómo puedo declarar struct Student en "student.h" para poder simplemente #incluir "student.h" y comenzar a usar struct?
De acuerdo, tres cosas importantes que noté
Necesita incluir el archivo de encabezado en su archivo de clase
Nunca, NUNCA coloque una directiva using dentro de un encabezado o clase, más bien haga algo como std :: cout << "say stuff";
Las estructuras están completamente definidas dentro de un encabezado, las estructuras son esencialmente clases que por defecto son públicas
¡Espero que esto ayude!
No debe colocar una directiva de using
en un archivo de encabezado, puede darle problemas en el futuro.
También necesita un protector de inclusión en su encabezado.
EDITAR: por supuesto, después de haber solucionado el problema de inclusión de guardia, también necesita una declaración completa de estudiante en el archivo de encabezado. Como lo señalaron otros, la declaración directa no es suficiente en su caso.
No puedes.
Para "usar" la estructura, es decir, para poder declarar objetos de ese tipo y acceder a sus elementos internos, necesita la definición completa de la estructura. Entonces, si desea hacer algo de eso (y lo hace, a juzgar por sus mensajes de error), debe colocar la definición completa del tipo de estructura en el archivo de encabezado.
Prueba esta nueva fuente:
student.h
#include <iostream>
struct Student {
std::string lastName;
std::string firstName;
};
student.cpp
#include "student.h"
struct Student student;
Solo tiene una declaración de avance para el student
en el archivo de encabezado; necesita colocar la declaración de estructura en el archivo de encabezado, no en .cpp. Las definiciones del método estarán en .cpp (suponiendo que tenga alguna).
Su archivo student.h solo reenvía declara una estructura llamada "Estudiante", no define una. Esto es suficiente si solo se refiere a él a través de una referencia o un puntero. Sin embargo, tan pronto como intentes usarlo (incluso creando uno) necesitarás la definición completa de la estructura.
En resumen, mueva su struct Student {...}; en el archivo .h y utilice el archivo .cpp para la implementación de las funciones de miembro (que no tiene ninguno, por lo que no necesita un archivo .cpp).