访问全局数据结构

时间:2017-01-26 23:23:55

标签: c++

我是C ++的新手并尝试制作一张所有源文件都能够访问的地图。这是有问题的代码的简化版本。每个头文件都有一个标题保护,我只是没有在这里输入它们。

// main.cpp

#include "client.hpp"
int main(void){
    init();
    search();
}


// util.cpp

#include "util.hpp"
std::map<int, STUDENT_TYPE> dataBase;
init(){
    dataBase[0] = STUDENT_TYPE(14, 4.0);
    // more students....
}


// util.hpp

#include <map>

struct STUDENT_TYPE{
    int age;
    int grade;
    STUDENT_TYPE(int age, int grade) : age(age), grade(grade){}

};
extern std::map<int, STUDENT_TYPE> dataBase;



// client.cpp
#include "client.hpp"
void search(){
    std::cout << dataBase[0].grade << std::endl;

}



// client.hpp
#include "util.hpp"
void search();

问题是编译器无法在搜索功能上构建。它给出了一大堆错误。最后一个错误或所有错误的原因是STUDENT_TYPE的构造函数在给定0时需要2个字段。我怀疑客户端无法访问dataBase中的STUDENT_TYPE结构。我不知道如何修复它或确切地说它是如何发生的。我只想要一个学生大表,程序中的所有文件都可以访问。

2 个答案:

答案 0 :(得分:3)

编译器正在告诉你究竟出了什么问题。您的学生类型没有默认构造函数并且正在使用它。

为什么要使用它?

因为map::operator []将创建一个默认的构造实例,如果该键的条目尚不存在则返回该实例。即使这种情况从未发生过,编译器仍然必须编译该分支,它不能在这里。

两种解决方法:

  1. 为您的学生输入一个有意义的默认设置。
  2. 不要使用map::operator[]。而是使用map::find

答案 1 :(得分:1)

第一种解决方案;没有全局数据结构。通常根本不需要这样的东西。

其次,了解标题保护程序的作用 - 它们会阻止标题文件的正文包含在相同的转换单元中。如果头文件包含在多个.cpp文件中,则它们无效。

第三,当您在此处发布有关问题的问题时,请发布您收到的错误消息的全文。