C ++,如何在头文件中声明结构

时间:2010-04-28 20:39:11

标签: c++ struct include header header-files

我一直在尝试在student.h文件中包含一个名为“student”的结构,但我不太清楚该怎么做。

我的student.h文件代码完全由以下内容组成:

#include<string>
using namespace std;

struct Student;

虽然student.cpp文件完全由以下内容组成:

#include<string>
using namespace std;

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

不幸的是,使用#include "student.h"的文件会出现很多错误,例如

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 

编译器(VC ++)似乎无法识别“student.h”中的struct Student?

如何在“student.h”中声明struct Student,以便我可以#include“student.h”并开始使用struct?

7 个答案:

答案 0 :(得分:26)

试试这个新来源:

student.h

#include <iostream>

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

student.cpp

#include "student.h"

struct Student student;

答案 1 :(得分:19)

您不应在头文件中放置using指令,而是创建unnecessary headaches

您的标题中还需要include guard

编辑:当然,在修复了包含保护问题之后,您还需要在头文件中完整地声明学生。正如其他人所指出的那样,前瞻性声明在你的情况下是不够的。

答案 2 :(得分:17)

你的student.h文件只转发声明一个名为“Student”的结构,它没有定义一个。如果您只通过引用或指针引用它,这就足够了。但是,只要您尝试使用它(包括创建一个),您就需要完整的结构定义。

简而言之,移动你的struct Student {...};到.h文件并使用.cpp文件来实现成员函数(它没有,因此你不需要.cpp文件)。

答案 3 :(得分:16)

C ++,如何在头文件中声明结构:

将此文件放在名为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;
}

将其放入名为student.h的文件中

#ifndef STUDENT_H
#define STUDENT_H

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

#endif

编译并运行它,它应该产生这个输出:

s1.firstName = "fred";

<强>普罗蒂普:

您不应在C ++头文件中放置using namespace std;指令,因为您可能会导致不同库之间的静默名称冲突。要解决此问题,请使用完全限定名称:std::string foobarstring;,而不是将std命名空间包含在string foobarstring;中。

答案 4 :(得分:4)

您只在头文件中获得student的转发声明;你需要将struct声明放在头文件中,而不是.cpp。方法定义将在.cpp中(假设您有)。

答案 5 :(得分:2)

好的,我注意到了三件大事

  1. 您需要在头文件中包含头文件

  2. 从不,在标题或类中放置using指令,而是执行类似std :: cout&lt;&lt;的操作。 “说些什么”;

  3. 结构在标题中完全定义,结构本质上是默认为public的类

  4. 希望这有帮助!

答案 6 :(得分:1)

你做不到。

为了“使用”结构,即能够声明该类型的对象并访问其内部,您需要结构的完整定义。所以,你想要做任何一件事(你可以做,根据你的错误信息判断),你必须将结构类型的完整定义放入头文件。