我一直在尝试调试这个几个小时,但没有运气。我知道你们会在几分钟内解决问题,所以情况如下:
我有大约 400 个 .cpp/.h 文件,称为 ProblemX.cpp/ProblemX.h(其中 X 是从 1 到 400 的数字)。每个文件都包含数学相关问题的解决方案。我想让问题在编译时将它们自己注册到具有唯一键的全局映射中(只需一个 int 就可以了),并将值作为指向启动数学问题解决方案的函数的指针。
全局映射在名为 Problem.h/Problem.cpp 的文件中创建和处理。但是,当第一个问题尝试在地图中自我注册时,我收到“访问冲突读取位置 0x00000004”。代码如下:
在 ProblemX.h 文件中(problem1 启动了此问题的解决方案):
#ifndef PROBLEM1_H
#define PROBLEM1_H
#include "Problems.h"
#include <string>
std::string problem1();
static int rc1 = registerProblem(1, problem1);
#endif
在 Problems.h 文件中(problemFinder 是使用全局映射调用相应函数指针的函数):
#ifndef PROBLEMS_H
#define PROBLEMS_H
#include <string>
int registerProblem(int problemNum, std::string (*problemFunc)(void));
std::string problemFinder(int problemNum);
#endif
在 Problems.cpp 中:
#include "Problems.h"
#include <iostream>
#include <map>
using namespace std;
map<int,std::string (*)(void)> problems_map;
int registerProblem(int problemNum, string (*problemFunc)(void)) {
int rc = 0;
problems_map[problemNum] = problemFunc;
return rc;
}
string problemFinder(int problemNum) {
string retStr = "";
retStr = problems_map[problemNum]();
return retStr;
}
访问冲突发生在“problems_map[problemNum] = problemFunc;”的位置。
谢谢!