C++, comment déclarer une structure dans un fichier d'en-tête

j'ai essayé d'inclure une structure appelée "étudiant" dans un student.h fichier, mais je ne sais pas trop comment le faire.

Mon student.h le code de fichier se compose entièrement de:

#include<string>
using namespace std;

struct Student;

student.cpp le fichier est constitué entièrement de:

#include<string>
using namespace std;

struct Student {
    string lastName, firstName;
    //long list of other strings... just strings though
};

Malheureusement, les fichiers qui utilisent #include "student.h" venir avec de nombreuses erreurs comme

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 

il semble que le compilateur (VC++) ne reconnaît pas struct Student de "student.h"?

Comment puis-je déclarez l'étudiant structurel dans " étudiant.h "pour que je puisse juste #inclure" étudiant.h" et commencer à utiliser la structure?

21
demandé sur Eric Leschinski 2010-04-29 00:39:11

7 réponses

Vous ne devriez pas placer un using la directive dans un fichier d'en-tête, il peut vous donner des problèmes à l'avenir.

Vous avez aussi besoin d'un inclure garde dans votre en-tête.

EDIT: bien sûr, après avoir corrigé la question include guard, vous avez aussi besoin d'une déclaration complète de l'étudiant dans le fichier d'en-tête. Comme d'autres l'ont fait remarquer, la déclaration préalable n'est pas suffisante dans votre cas.

17
répondu baol 2010-05-16 17:55:07

Essayer ce nouveau source :

étudiant.h

#include <iostream>

struct Student {
    std::string lastName;
    std::string firstName;
};

étudiant.rpc

#include "student.h"

struct Student student;
26
répondu Zai 2017-03-22 08:33:33

Votre élève.h fichier vers l'avant uniquement déclare une structure nommée "Étudiant", il ne définit pas un. Ceci est suffisant si vous vous y référez seulement par référence ou pointeur. Cependant, dès que vous essayez de l'utiliser (y compris la création d'un), vous aurez besoin de la définition complète de la structure.

en bref, déplacez votre étudiant struct { ... }; dans le .h fichier et utiliser la .fichier cpp pour la mise en œuvre de fonctions de membre (qui n'en a pas, donc vous n'avez pas besoin d'un .fichier cpp).

17
répondu Crazy Eddie 2010-04-28 20:43:35

C++, comment déclarer une structure dans un fichier d'en-tête:

mettez ceci dans un fichier appelé main.rpc:

#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;
}

mettre ça dans un fichier nommé élève.h

#ifndef STUDENT_H
#define STUDENT_H

#include<string>
struct Student {
    std::string lastName, firstName;
};

#endif

compilez - le et lancez-le, il devrait produire cette sortie:

s1.firstName = "fred";

Protip:

Vous ne devriez pas placer un using namespace std; directive dans le fichier d'en-tête C++ parce que vous pouvez causer des conflits de nom silencieux entre différentes bibliothèques. De remédier à cette situation, l'utilisation du nom complet: std::string foobarstring; au lieu d'inclure le namespace std avec string foobarstring;.

14
répondu Eric Leschinski 2017-03-22 12:54:26

Vous avez seulement une déclaration forward pour student dans le fichier d'en-tête; vous devez placer la déclaration struct dans le fichier d'en-tête, pas le .rpc. Les définitions de méthode seront dans le .rpc (en supposant que vous avez).

4
répondu andand 2010-04-28 20:42:28

Okay donc trois grandes choses que j'ai remarquées

  1. vous devez inclure le fichier d'en-tête dans votre fichier de classe

  2. ne Jamais, JAMAIS lieu à une aide de la directive à l'intérieur d'un en-tête ou de la classe, plutôt faire quelque chose comme std::cout << "dire des choses";

  3. les structures sont complètement définies dans un en-tête, les structures sont essentiellement des classes par défaut à public

Espérons que cette aide!

2
répondu Jordan LaPrise 2014-01-29 18:28:31

Vous ne pouvez pas.

pour "utiliser" la structure, c'est-à-dire pouvoir déclarer des objets de ce type et accéder à ses internes, vous avez besoin de la définition complète de la structure. Donc, si vous voulez faire tout cela (et vous le faites, à en juger par vos messages d'erreur), vous devez placer la définition complète du type struct dans le fichier d'en-tête.

0
répondu AnT 2013-07-09 15:54:51