头文件中的类-无法编译? 我是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
——但这可能是偏执。我也建议你不要使用大写作为符号名。大写通常是保留的为预处理器变量编辑。将类命名为simple
Student
haha谢谢:)这个网站真的非常棒…即使是像我这样的新手,你们也给了我很多帮助:p我之前在yahoo answers上发布过这个,但没有得到任何回应