跨多个类的全局变量而不会发生重新定义错误?

时间:2018-09-29 22:23:33

标签: c++

极端的c ++初学者在这里。我已经尝试将全局变量放入单独的头文件以及特定类本身中。在整个过程中,我收到“重新定义”错误。

以下是全局变量:

enum GRADE {F, D, CMINUS, C, CPLUS, BMINUS, B, BPLUS, AMINUS, A};
const int BAR = 60;
const int MAXSTUDENT = 100;

我在两个单独的类(分别为student.cpp和course.cpp)中使用和调用了它们。它们包含在“ global.cpp”中

这是Student.cpp中的标题

#include "student.hpp"
#include "global.cpp"
#include <iostream>
using namespace std;

这是Course.cpp中的标题

#include "course.hpp"
#include "student.cpp"
#include <iostream>
using namespace std;

无论标头是什么组合,或尝试将全局变量拆分为它们正在使用的类,我都会遇到“重新定义”错误。如果我在course.cpp部分中未包含“#student.cpp”,则不会收到错误消息,但是我需要Student.cpp才能使Course.cpp正常工作。

我走出了局限,不胜感激。

1 个答案:

答案 0 :(得分:0)

创建文件global.h。在该文件中,您可以声明全局变量。 enum GRADE不是变量,而是类型。重要的是要记住,可以多次声明类型和变量,但是只能定义一次。因此,不要在标头中定义它们,而只需声明它们即可。如果要在多个cpp文件中使用相同的全局变量,则必须使用外部链接对其进行声明。

/* File global.h */

#pragma once
extern const int BAR;
extern const int MAXSTUDENT;

这是一个示例student.h

/* File student.h */

#pragma once

enum GRADE {F, D, CMINUS, C, CPLUS, BMINUS, B, BPLUS, AMINUS, A};

class Student
{
public:
    Student();
    virtual ~Student();
    /* put more members here */
};

下面是一个示例course.h

/* File course.h */

#pragma once

#include "student.h"

class Course
{
public:
    Course();
    virtual ~Course();
    void addStudent(Student& student);
private:
    std:vector<Student*> students;
}

然后,您可以选择一个 * .cpp文件来定义全局变量。 例如,您将它们放在student.cpp中。然后您就可以在student.cpp中使用它们了:

/* File student.cpp */

#include "student.h"

const int BAR = 60;
const int MAXSTUDENT = 100;

/* definition of student methods ... for example */
Student::Student()
{ }

Student::~Student()
{ }

在这种情况下,您不会在global.h文件中包含student.cpp。 另外,请不要#include任何* .cpp文件。

将学生班级的声明放到student.h中,将学生班级的方法定义放到student.cpp中。

course.cpp中仅包括global.hcourse.h。但是student.h已通过course.h包括在内。然后,您也可以在此cpp中使用全局变量。

/* file course.cpp */

#include "course.h"
#include "global.h"

/* definition of course methods ... for example */
Course::Course()
{ }

Course::~Course()
{ }

Course::addStudent(Student& student)
{
    if(students.size() < MAXSTUDENT) {
        // ......
    }
}

希望对您有帮助。