C++, how to declare a struct in a header file

149,352

Solution 1

You should not place an using directive in an header file, it creates unnecessary headaches.

Also you need an include guard in your header.

EDIT: of course, after having fixed the include guard issue, you also need a complete declaration of student in the header file. As pointed out by others the forward declaration is not sufficient in your case.

Solution 2

Try this new source :

student.h

#include <iostream>

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

student.cpp

#include "student.h"

struct Student student;

Solution 3

C++, how to declare a struct in a header file:

Put this in a file called 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;
}

put this in a file named student.h

#ifndef STUDENT_H
#define STUDENT_H

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

#endif

Compile it and run it, it should produce this output:

s1.firstName = "fred";

Protip:

You should not place a using namespace std; directive in the C++ header file because you may cause silent name clashes between different libraries. To remedy this, use the fully qualified name: std::string foobarstring; instead of including the std namespace with string foobarstring;.

Solution 4

Your student.h file only forward declares a struct named "Student", it does not define one. This is sufficient if you only refer to it through reference or pointer. However, as soon as you try to use it (including creating one) you will need the full definition of the structure.

In short, move your struct Student { ... }; into the .h file and use the .cpp file for implementation of member functions (which it has none so you don't need a .cpp file).

Solution 5

You've only got a forward declaration for student in the header file; you need to place the struct declaration in the header file, not the .cpp. The method definitions will be in the .cpp (assuming you have any).

Share:
149,352
wrongusername
Author by

wrongusername

Updated on September 06, 2020

Comments

  • wrongusername
    wrongusername over 3 years

    I've been trying to include a structure called "student" in a student.h file, but I'm not quite sure how to do it.

    My student.h file code consists of entirely:

    #include<string>
    using namespace std;
    
    struct Student;
    

    while the student.cpp file consists of entirely:

    #include<string>
    using namespace std;
    
    struct Student {
        string lastName, firstName;
        //long list of other strings... just strings though
    };
    

    Unfortunately, files that use #include "student.h" come up with numerous errors like

    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 
    

    It appears the compiler (VC++) does not recognize struct Student from "student.h"?

    How can I declare struct Student in "student.h" so that I can just #include "student.h" and start using the struct?

  • wrongusername
    wrongusername almost 14 years
    Thanks for telling about the include guard... that fixed it. lol :)
  • Rob Kennedy
    Rob Kennedy almost 14 years
    -1. Although those are both true statements, I don't see how either of them would address the error messages reported in the question.
  • baol
    baol almost 14 years
    @rob It wasn't an answer meant to be accepted ;) I just thought he needed the two advices. I believe that my answer, combined with the others, regarding the forward declaration, solved the problem.
  • Hani Goc
    Hani Goc over 10 years
    hi @andand why would someone define a structure in a header file? Why not define a class directly?
  • andand
    andand over 10 years
    @HaniGoc, You declare the struct or class methods and members in the header so the class can be used in different places in the program. The class or struct method definitions (i.e. their bodies) are generally placed in .cpp files since if they are included in the header file and that header file is included in multiple .cpp files, the linker will complain of multiple definitions of those methods. The main exception is template definitions... those must be in the header file. That's just the way C++ works.
  • Jordan LaPrise
    Jordan LaPrise about 10 years
    I was just about to comment on the "using" directive haha, good eye.
  • Ruchir
    Ruchir over 8 years
    @andand You've said that struct definition are generally placed in .cpp files while other answers have advised to place it in the .h file. I followed what you said and it worked for me but not sure why other answers have advised differently. Please clarify as I'm still learning these concepts. Thanks!
  • Ruchir
    Ruchir over 8 years
    I think I've got the answer. If there are multiple .cpp files using the struct, it is better to define in .h file as the struct definition is accessible to any .cpp file which includes the .h file.
  • andand
    andand over 8 years
    @Ruchir that's essentially correct, though you need to make sure there is a guard against including of the same header multiple times for a single .cpp file. It also gets a little complicated when there is a circular dependency between header files; forward declarations are generally the way to avoid such problems, but it's probably better to simply avoid the issue in the first place where feasible.