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 ++,如何在头文件中声明结构的主要内容,如果未能解决你的问题,请参考以下文章