我正在为项目创建学生数据管理控制台应用程序。我创建了一个名为Student的类,它存储了学生需要拥有的所有数据,并且还包含与之关联的所有getter和setter。以下是我的所有文件的布局:
Student.h
#include <iostream>
#include <string>
using namespace std;
class Student {
private:
string name;
string id;
string email;
int presentation;
int essay1;
int essay2;
int project;
public:
//constructor
//Student();
//setters
void set_name(string);
void set_id(string);
void set_email(string);
void set_presentation(int);
void set_essay1(int);
void set_essay2(int);
void set_project(int);
//getters
string get_name();
string get_id();
string get_email();
int get_presentation();
int get_essay1();
int get_essay2();
int get_project();
};
Student.cpp
#include <iostream>
#include <string>
#include "Student.h"
using namespace std;
//constructor definition
/*
Student::Student(void) {
cout << "Student created" << endl;
}
*/
//setter definition
void Student::set_name(string s) {
name = s;
}
void Student::set_id(string s) {
id = s;
}
void Student::set_email(string s) {
email = s;
}
void Student::set_presentation(int a) {
presentation = a;
}
void Student::set_essay1(int a) {
essay1 = a;
}
void Student::set_essay2(int a) {
essay2 = a;
}
void Student::set_project(int a) {
project = a;
}
//getter definition
string Student::get_name() {
return name;
}
string Student::get_id() {
return id;
}
string Student::get_email() {
return email;
}
int Student::get_presentation() {
return presentation;
}
int Student::get_essay1() {
return essay1;
}
int Student::get_essay2() {
return essay2;
}
int Student::get_project() {
return project;
}
Main.cpp的
#include <iostream>
#include <string>
#include "Student.h"
using namespace std;
int main() {
cout << "Hello World!" << endl;
Student student1;
Student student2;
Student student3;
student1.set_name("John");
student2.set_name("Bob");
student3.set_name("Carl");
return 0;
}
当我尝试运行我的程序时,除其他外,我得到以下错误:
错误1错误C2011:&#39;学生&#39; :&#39; class&#39;类型重新定义
错误2错误C2079:&#39; student1&#39;使用未定义的班级&#39;学生&#39;
错误5错误C2228:左边的&#39; .set_name&#39;必须有class / struct / union
错误9错误C2027:使用未定义类型&#39;学生&#39;
我该如何解决此问题?
答案 0 :(得分:0)
我很确定这是由student.h
在某个.cpp
文件中包含两次这一事实引起的错误。因此,您需要使用所谓的标头保护来确保文件仅包含在每个.cpp
文件中一次:
#ifndef STUDENT_H
#define STUDENT_H
#include <iostream>
#include <string>
using namespace std;
class Student {
/* ... */
};
#endif
这背后的想法是#include
是一个预处理程序指令,导致参数文件被复制到发出#include
的文件中。因此,如果文件A和B包括Student.h
,并且文件C包括文件A和B,那么class Student
的声明将最终重复。因此错误。上面的宏确保不会发生这种情况。
根据问题作者的评论进行编辑:
#pragma once
与#ifndef .. #define #endif
相同,但非标准。
请参阅#pragma once vs include guards?以供参考。
答案 1 :(得分:-1)
我有同样的错误。我只是清理并重建解决方案并解决了错误。