web-dev-qa-db-fra.com

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.

Ma student.h le code du fichier comprend entièrement:

#include<string>
using namespace std;

struct Student;

tandis que le student.cpp le fichier comprend entièrement:

#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" trouver 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 reconnaisse pas la structure Student de "student.h"?

Comment puis-je déclarer struct Student dans "student.h" afin que je puisse simplement #inclure "student.h" et commencer à utiliser la structure?

22
wrongusername

Vous ne devez pas placer une directive using dans un fichier d'en-tête, cela crée maux de tête inutiles .

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

EDIT: bien sûr, après avoir résolu le problème d'inclusion de garde, vous avez également besoin d'une déclaration complète de l'étudiant dans le fichier d'en-tête. Comme d'autres l'ont souligné, la déclaration préalable n'est pas suffisante dans votre cas.

19
baol

Essayez cette nouvelle source:

student.h

#include <iostream>

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

student.cpp

#include "student.h"

struct Student student;
26
Zai

Votre fichier student.h ne fait que déclarer une structure nommée "Student", il n'en définit pas une. Cela suffit si vous ne vous y référez que par référence ou pointeur. Cependant, dès que vous essayez de l'utiliser (y compris en créer un), vous aurez besoin de la définition complète de la structure.

En bref, déplacez votre struct Student {...}; dans le fichier .h et utilisez le fichier .cpp pour l'implémentation des fonctions membres (qu'il n'en a pas, vous n'avez donc pas besoin d'un fichier .cpp).

17
Edward Strange

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

Mettez ceci dans un fichier appelé 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;
}

mettez ceci dans un fichier nommé student.h

#ifndef STUDENT_H
#define STUDENT_H

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

#endif

Compilez-le et exécutez-le, il devrait produire cette sortie:

s1.firstName = "fred";

Protip:

Vous ne devez pas placer un using namespace std; directive dans le fichier d'en-tête C++ car vous pouvez provoquer des conflits de noms silencieux entre différentes bibliothèques. Pour y remédier, utilisez le nom complet: std::string foobarstring; au lieu d'inclure l'espace de noms std avec string foobarstring;.

16
Eric Leschinski

Vous n'avez qu'une déclaration directe 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 .cpp. Les définitions de méthode seront dans le .cpp (en supposant que vous en ayez).

4
andand

D'accord, 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. Jamais, JAMAIS placer une directive using à l'intérieur d'un en-tête ou d'une classe, plutôt faire quelque chose comme std :: cout << "say stuff";

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

J'espère que cela t'aides!

2
Jordan LaPrise

Tu ne peux pas.

Pour "utiliser" la structure, c'est-à-dire pour 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 de structure dans le fichier d'en-tête.

1
AnT