C++, how to declare a struct in a header file
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).
wrongusername
Updated on September 06, 2020Comments
-
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 likeerror 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 almost 14 yearsThanks for telling about the include guard... that fixed it. lol :)
-
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 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 over 10 yearshi @andand why would someone define a structure in a header file? Why not define a class directly?
-
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 about 10 yearsI was just about to comment on the "using" directive haha, good eye.
-
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 over 8 yearsI 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 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.