头文件中的类-无法编译? 我是C++的新手。我试图在C++中创建头文件,将类放入其中,并将其包含在主FN中。当我在.h文件中只声明函数(而不是类成员fns.)并在同名的.cpp文件中声明它们的定义时,一切都正常。但是,当在头文件中定义了类时,在编译项目时会出现一些错误!请帮助我解决这个问题,因为我在网上没有找到任何有用的东西(谷歌)
这是我的密码:头文件中的类-无法编译? 我是C++的新手。我试图在C++中创建头文件,将类放入其中,并将其包含在主FN中。当我在.h文件中只声明函数(而不是类成员fns.)并在同名的.cpp文件中声明它们的定义时,一切都正常。但是,当在头文件中定义了类时,在编译项目时会出现一些错误!请帮助我解决这个问题,因为我在网上没有找到任何有用的东西(谷歌),c++,C++,这是我的密码: // STUDENT.h #ifndef STUDENT #define STUDENT class STUDENT { private : int marks; public : void setMarks(int); void getMarks(); }; #endif //STUDENT.cpp #include <iostream> #include "STUDENT.h" void STUDENT :: setMarks(int x) { marks
// STUDENT.h
#ifndef STUDENT
#define STUDENT
class STUDENT
{
private :
int marks;
public :
void setMarks(int);
void getMarks();
};
#endif
//STUDENT.cpp
#include <iostream>
#include "STUDENT.h"
void STUDENT :: setMarks(int x)
{
marks = x;
}
void STUDENT :: getMarks()
{
cout << marks;
}
#包括
#包括“STUDENT.h”
无效学生::设置标记(int x)
{
分数=x;
}
void STUDENT::getMarks()
{
cout预处理器看到:
#define STUDENT
class STUDENT
{
…
};
class
{
…
};
编译器(预处理后)会看到:
#define STUDENT
class STUDENT
{
…
};
class
{
…
};
预处理器会看到:
#define STUDENT
class STUDENT
{
…
};
class
{
…
};
编译器(预处理后)会看到:
#define STUDENT
class STUDENT
{
…
};
class
{
…
};
您的问题是以下两行:
#define STUDENT
class STUDENT
第一个命令告诉预处理器定义一个名为STUDENT
且主体为空的宏。当预处理器看到任何提及STUDENT
的内容时,它会将其替换为主体,在这种情况下,没有任何内容(因为宏主体为空)
要解决此问题,请更改#define
或更改类名。您的问题在于以下两行:
#define STUDENT
class STUDENT
第一个命令告诉预处理器定义一个名为STUDENT
且主体为空的宏。当预处理器看到任何提及STUDENT
的内容时,它会将其替换为主体,在这种情况下,没有任何内容(因为宏主体为空)
要解决此问题,请更改#define
或更改类名。按如下方式重命名标题保护,您应该可以
#ifndef STUDENT_H
#define STUDENT_H
将收割台护罩重命名如下,您应该可以
#ifndef STUDENT_H
#define STUDENT_H
嗯,class STUDENT
…这应该被标记为家庭作业,对吗?你为什么不在STUDENT.cpp中使用名称空间std;
呢?我知道我的实际项目是不同的。我制作这个只是为了在网上发布…它就像一个较小的类,但与我项目中的一个类似…是的,我在所有文件中都使用了名称空间,并尝试了它,但没有工作…最后更改了宏标识符mm,class STUDENT
…这应该被标记为家庭作业,对吗?为什么不在STUDENT.cpp中使用名称空间std;?我知道我的实际项目不同。我制作这个只是为了在网上发布…它就像一个较小的类,但与我项目中的类相似…是的,我确实使用了在所有文件中使用名称空间,并尝试使用它,但它不起作用…最终更改了宏标识符,或者,更好的是,为这两个文件选择合理的名称,例如为include guard选择\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,为类选择STUDENT
。@DavidSchwartz尽管按照标准(C和C++两个我认为)为编纂保留这些名字。非常感谢:)它工作了!但是我现在有更小的问题:(!当我编译时,它说STUDENT.cpp文件的getMarks fn..中未声明“marks”…为什么?supp不应该像成员fns一样。一个类的成员可以访问该类的pvt数据吗?@PushkarDk如果你更改了类名,你记得不仅要在头文件中更改,而且还要在源文件中更改?@JoachimPileborg这可能是因为他在student.cpp中使用cout
,但没有使用名称空间std;添加,或者更好地为这两个名称选择合理的名称,例如为include guard选择\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,为类选择student
。@DavidSchwartz尽管按照标准使用双前导下划线可能不是一个好主意(C和C++两个我认为)为编纂保留这些名字。非常感谢:)它工作了!但是我现在有更小的问题:(!当我编译时,它说STUDENT.cpp文件的getMarks fn..中未声明“marks”…为什么?supp不应该像成员fns一样。一个类的成员可以访问该类的pvt数据吗?@PushkarDk如果你更改了类名,你记得不仅要在头文件中更改,而且还要在源文件中更改?@JoachimPileborg这可能是因为他在student.cpp中使用cout
,但没有使用namespace std;
添加,所以我应该怎么做才能成功地编译我的程序???@PushkarDk应该很明显:你需要确保为include-guards提供唯一的名称。它们不必很好,只要是唯一的。比如你的名字\u头\u-student\H代码>非常常见。如果你想确保它的唯一性,你也可以生成一个,例如INCLUDE_F80F35D0_DA2F_11E1_9B23_0800200C9A66_H
——但这可能是偏执。我还建议你不要对符号名称使用大写。大写通常是为预处理器变量保留的。将类命名为simplee> 学生
哈哈,谢谢:)这个网站真的非常棒…即使是像我这样的新手,你也给了我很多帮助:p我之前在yahoo answers上发布过这个,但是我没有得到任何回应。我应该怎么做才能成功地编译我的程序???@PushkarDk这应该是显而易见的:你需要确保为include卫士提供唯一的名称。他们不一定很好,只是独特。类似于你的名字\u标题\u学生\u H
的东西非常常见。如果你想确保它是唯一的,你也可以生成一个,例如INCLUDE\u F80F35D0\u DA2F\u 11E1\u 9B23\u 0800200C9A66\u H
——但这可能是偏执。我也建议你不要使用大写作为符号名。大写通常是保留的为预处理器变量编辑。将类命名为simpleStudent
haha谢谢:)这个网站真的非常棒…即使是像我这样的新手,你们也给了我很多帮助:p我之前在yahoo answers上发布过这个,但没有得到任何回应