-1

嘿,我试图从多图打印出来。我的多图是:multimap<int,Questions*> map; 我想要发生的事情是当我提出问题时: questions.printQuestion(1); 它以随机顺序打印出 3 个问题。但是到目前为止,我得到的只是调用 printQuestion 时的运行时错误。

Run time error: 
Debug Assertion Failed!
Expression: map/set iterator may not be dereferencable 

这是我的代码:

#include <iostream>
#include "Questions.h"
using namespace std;

Questions :: Questions()
{
}

Questions::Questions(string question,string correctAnswer, string wrongAnswer1,string wrongAnswer2,string wrongAnswer3)
{
    this->question = question;
    this->pAnswers = new string[4];
    this->pAnswers[0]=wrongAnswer1;
    this->pAnswers[1]=wrongAnswer2;
    this->pAnswers[2]=wrongAnswer3;
    this->pAnswers[3] =correctAnswer;
    this->shuffle(this->pAnswers,4);
    this->correctAnswer = correctAnswer;
}

void Questions::shuffle(string *array, int n)
{
    random_shuffle(&this->pAnswers[0],&this->pAnswers[4]);
}

string Questions::getQuestion()
{
    return this->question;
}

string Questions::getCorrectAnswer()
{
    return this->correctAnswer;
}

string* Questions::getAnswers()
{
    return this->pAnswers;
}

bool Questions::checkAnswer(string answer)
{
    if(this->correctAnswer.compare(answer)==0)
    {
        return true;
    }
    return false;
}

void Questions::questionStore()
{
    Questions *q1 = new Questions("Whats the oldest known city in the world?", "Sparta" , "Tripoli" , "Rome", "Demascus");
    Questions *q2 = new Questions("What sport in the olympics are beards dissallowed?", "Judo", "Table Tennis" , "Volleyball", "Boxing");
    Questions *q3 = new Questions("What does an entomologist study?", "People" , "Rocks" , "Plants", "Insects");
    Questions *q4 = new Questions("Where would a cowboy wear his chaps?", "Hat" , "Feet" , "Arms", "Legs");
    Questions *q5 = new Questions("which of these zodiac signs is represented as an animal that does not grow horns?", "Aries" , "Tauris" , "Capricorn", "Aquarius");
    Questions *q6 = new Questions("Former Prime Minister Tony Blair was born in which country?", "Northern Ireland" , "Wales" , "England", "Scotland");
    Questions *q7 = new Questions("Duffle coats are named after a town in which country?", "Austria" , "Holland" , "Germany", "Belgium");
    Questions *q8 = new Questions("The young of which creature is known as a squab?", "Horse" , "Squid" , "Octopus", "Pigeon");
    Questions *q9 = new Questions("The main character in the 2000 movie ""Gladiator"" fights what animal in the arena?", "Panther" , "Leopard" , "Lion", "Tiger");

    addQuestion(1,q1);
    addQuestion(1,q2);
    addQuestion(1,q3);
    addQuestion(2,q4);
    addQuestion(2,q5);
    addQuestion(2,q6);
    addQuestion(3,q7);
    addQuestion(3,q8);
    addQuestion(3,q9);
}

void Questions::addQuestion(int level, Questions *question)
{
    map.insert(pair<int,Questions*>(level,question));
}


Questions* Questions::printQuestion(int level)
{
    multimap<int, Questions*>::iterator iter;
    pair<multimap<int, Questions*>::iterator,multimap<int, Questions*>::iterator> constIter;
    for (multimap< int, Questions*, less< int > >::const_iterator iter =map.begin();
    iter != map.end(); ++iter )
      cout << iter->first << '\t' << iter->second << '\n';



        /*constIter = map.equal_range(level);
    size_t sz = distance(constIter.first, ret.second);
    size_t idx = rand();
    if(ret.first != ret.second)
    advance(ret.first, idx);
    it =ret.first;
    Questions* question = (*it).second;
    return (*it).second;
       cout << question->getQuestion() << std::endl;*/
       return iter->second;
}

任何人都可以帮我解决这个问题。

4

1 回答 1

1

当你说你得到一个“运行时错误”时,我假设函数打印和整数以及指针的地址。您可能打算在打印之前取消引用指向问题的指针:

*it->second

另一个问题是你在 return 时取消引用过去的迭代器:语句iter->second前面的循环在. 取消引用过去的结束迭代器是非法的,并导致未定义的行为(这是实际断言的错误)。returniter == map.end()

当然,您可能应该Question首先存储对象而不是在堆上分配它们:它们很可能会泄漏。在“Question* s *”对象中存储“question”似乎也不太正确:您可能希望必须分开类:一个用于单个问题,一个用于收集多个问题。

于 2012-12-18T22:59:50.553 回答