使用:MSVS2012
代码
elemalg.h
#include <vector>
#include <string>
#include <fstream>
class ElemAlg
{
private:
std::string difficultlyLevel, question, answerToRead;
std::vector<std::string> questions, answers;
std::vector<std::string> GetQuiz(int);
};
elemalg.cpp
#include "elemalg.h"
std::vector<std::string> ElemAlg::GetQuiz(int difficulty)
{
if (difficulty == 1) { difficultyLevel = "algE"; }
if (difficulty == 2) { difficultyLevel = "algM"; }
if (difficulty == 3) { difficultyLevel = "algH"; }
if (difficulty == 4) { difficultyLevel = "algVH"; }
std::ifstream fin(difficultyLevel + ".txt");
while (std::getline(fin, question)) { questions.push_back(question); }
fin.close();
std::ifstream fin2(difficultyLevel + "Answers.txt");
while (std::getline(fin2, answerToRead)) { answers.push_back(answerToRead); }
fin2.close();
return questions;
}
MathTutor.cpp
#includes etc
ElemAlg *ea;
ea->GetQuiz(1);
GetQuiz
肯定传递了1到4之间的整数,这在调用该方法之前已得到验证difficultyLevel
是在头文件中定义的字符串。编译器在碰到第一个
if
函数后立即抛出未处理的异常和访问冲突写入位置。如果我删除
if
函数并将difficultyLevel
定义为algE,只是为了测试相同的问题。如果我完全删除
difficultyLevel
并仅以"algE.txt"
和"algEAnswers"
打开文件,那么一旦代码遇到while循环,我将遇到相同的问题,但是在不同的内存位置。 最佳答案
您的问题在这里:
ElemAlg *ea;
ea->GetQuiz(1);
您不是在创建
ElemAlg
的实例,而是在未初始化的指针上调用成员函数。因为您要调用的成员函数不是虚拟的,所以编译器不必进行任何运行时查找,这就是为什么调用转到
GetQuiz
的原因。但是,this
指针将是垃圾(因为ea
未初始化),因此,在访问成员变量(例如difficultyLevel
)的那一刻,您将具有未定义的行为。在您的情况下,未定义的行为会导致访问冲突。初始化
ea
:ElemAlg *ea=new ElemAlg;
ea->GetQuiz(1)
或者,如果您不需要在堆上分配它,请执行以下操作:
ElemAlg ea;
ea.GetQuiz(1)