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

Posted

技术标签:

【中文标题】C ++,如何在头文件中声明结构【英文标题】:C++, how to declare a struct in a header file 【发布时间】:2011-02-13 13:09:56 【问题描述】:

我一直在尝试在 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" 并开始使用该结构?

【问题讨论】:

在 student.h 中声明整个结构应该已经修复了。你没有告诉我们什么? 需要homework标签? 将struct定义放在header中会出现什么错误? 【参考方案1】:

试试这个新来源:

学生.h

#include <iostream>

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

student.cpp

#include "student.h"

struct Student student;

【讨论】:

【参考方案2】:

您不应将using 指令放在头文件中,它会创建unnecessary headaches。

您还需要在标题中添加include guard。

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

【讨论】:

感谢您告知包含保护... 修复了它。大声笑:) -1。尽管这些都是真实的陈述,但我看不出它们中的任何一个将如何解决问题中报告的错误消息。 @rob 这不是一个应该被接受的答案;)我只是认为他需要这两个建议。我相信我的回答,结合其他人,关于前向声明,解决了这个问题。 我正要评论“using”指令哈哈,好眼力。【参考方案3】:

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

将其放入名为 main.cpp 的文件中:

#include <cstdlib>
#include <iostream>
#include "student.h"

using namespace std;    //Watchout for ***es 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;,而不是使用 string foobarstring; 包含 std 命名空间。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

头文件中只有student 的前向声明;您需要将结构声明放在头文件中,而不是 .cpp 中。方法定义将在 .cpp 中(假设您有)。

【讨论】:

嗨 @and 为什么有人会在头文件中定义结构?为什么不直接定义一个类? @HaniGoc,您在标头中声明结构或类方法和成员,以便该类可以在程序中的不同位置使用。类或结构方法定义(即它们的主体)通常放在 .cpp 文件中,因为如果它们包含在头文件中并且该头文件包含在多个 .cpp 文件中,链接器将抱怨这些方法的多个定义。主要的例外是模板定义......那些必须在头文件中。这就是 C++ 的工作方式。 @andand 你说过结构定义通常放在 .cpp 文件中,而其他答案建议将它放在 .h 文件中。我按照您所说的进行,它对我有用,但不确定为什么其他答案的建议不同。请澄清,因为我仍在学习这些概念。谢谢! 我想我已经找到答案了。如果有多个 .cpp 文件使用该结构,最好在 .h 文件中定义,因为任何包含 .h 文件的 .cpp 文件都可以访问结构定义。 @Ruchir 这基本上是正确的,但您需要确保防止在单个 .cpp 文件中多次包含相同的标头。当头文件之间存在循环依赖时,它也会变得有点复杂;前向声明通常是避免此类问题的方法,但在可行的情况下,最好一开始就避免该问题。【参考方案6】:

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

    你需要在你的类文件中包含头文件

    永远不要在标头或类中放置 using 指令,而应执行 std::cout

    之类的操作

    结构完全在标头中定义,结构本质上是默认为公共的类

希望这会有所帮助!

【讨论】:

【参考方案7】:

你不能。

为了“使用”结构,即能够声明该类型的对象并访问其内部,您需要结构的完整定义。因此,如果您想要执行任何操作(根据您的错误消息判断,您确实这样做了),您必须将 struct 类型的完整定义放入头文件中。

【讨论】:

以上是关于C ++,如何在头文件中声明结构的主要内容,如果未能解决你的问题,请参考以下文章

C语言头文件中定义结构体的问题

c语言在头文件中如何引用另一个头文件中的函数

c语言中,如何在头文件中调用某个源文件的函数??

结构体写在头文件中怎么写,在其它函数文件中怎么引用

结构体写在头文件中怎么写,在其它函数文件中怎么引用

为啥不包含头文件却可以调用函数,谁来解释