私はこれを何時間もデバッグしようとしてきましたが、うまくいきませんでした。皆さんなら数分以内に問題を解決できると思いますので、状況は次のとおりです。
ProblemX.cpp/ProblemX.h (X は 1 から 400 の数字) という .cpp/.h ファイルが 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;」でアクセス違反が発生します。
ありがとう!