获取类类型重新定义和一些其他错误

时间:2016-09-25 00:37:13

标签: c++

我正在为项目创建学生数据管理控制台应用程序。我创建了一个名为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;

我该如何解决此问题?

2 个答案:

答案 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)

我有同样的错误。我只是清理并重建解决方案并解决了错误。