Я пытаюсь использовать QVector
класс от Qt
работать (для меня: P). То, что я хочу сделать, это поместить несколько экземпляров объекта Question
в QVector
,
Я ходил на несколько форумов, но они слишком сложны для меня, так как я новичок.
это один пост был идеальным но я не нашел способа решить мою проблему.
Поэтому я обращаюсь к вам, чтобы помочь мне!
Вот функция, которую я хочу работать:
Часть, которая создает пакет / вектор
/**
* @brief MenuQuestionnary::assembleQuiz
* Assemble the bundle of question that will be used in Quiz class
*/
void MenuQuestionnary::assembleQuiz(){
QVector<Question> vectorQuiz;
vectorQuiz.reserve(spinBoxNumberOfQuestion->value());
for(int i = 0; i <= spinBoxNumberOfQuestion->value(); i++){
vectorQuiz.append(Question((qrand()% maximumNumberOfQuestionAvailable)));
}
}
Вот мой конструктор Вопросов:
Question::Question(int id)
{
this->questionId = id;
//TODO: Actually get it from DB
this->questionText = "2+2?";
this->explanation = "Addition mechanics";
this->creatorId = 1;
}
То, что я ожидаю сделать здесь, это поставить выбранное число Question
объект в vector
, После этого я могу передать его в другой класс. Оттуда я смогу извлечь из них текст (questionText
а также questionExplanation
).
Вы пытаетесь выдвинуть объекты типа класса Question
в QVector<int>
что, очевидно, ожидает int
вместо. Вы должны изменить это на QVector<Question>
начать с.
Однако я настоятельно рекомендую вам прочитать Хорошая книга на C ++, прежде чем идти дальше, или ваш опыт работы с ним будет становиться все более и более сложным.
Копировать код вставки с форумов в интернете не программирование и скоро доставит вам неприятности.
Я думаю, что вы хотите, это: QVector vectorQuiz; vectorQuiz.reserve (spinBoxNumberOfQuestion-> значение ()); // зарезервировать правильное количество места в векторе для исполнения (не обязательно). Я не знаю точно, как вы собираетесь использовать vectorQuiz, но, возможно, вам следует использовать указатели на вопросы, то есть QVector, и вставлять вопросы с помощью нового Question ()
/**
* @brief MenuQuestionnary::assembleQuiz
* Assemble the bundle of question that will be used in Quiz class
*/
void MenuQuestionnary::assembleQuiz(){
int iVectorSize = spinBoxNumberOfQuestion->value();
QVector<Question> vectorQuiz;
vectorQuiz.reserve(iVectorSize );
for(int i = 0; i <= iVectorSize ; ++i){
vectorQuiz.append(Question(i));
}
}
Ваш объект (vectorQuiz) объявлен как вектор целых чисел. Если вы хотите добавить к нему некоторое целочисленное значение, вы должны написать что-то:
vectorQuiz.append( someIntegerValue );
или же
vectorQuiz.push_back( someIntegerValue );
Для вектора другого типа (т.е. вопрос) напишите код, подобный этому:
QVector<Question> vectorQuiz;
// ...
for(int i = 0; i <= spinBoxNumberOfQuestion->value(); ++i){
vectorQuiz.append(Question(i)); // without [i] after vector object
}
И возможно, вы должны использовать строгое неравенство < вместо <знак равно в течение цикла (но я не уверен).
Я решил это, попробовав несколько вещей
Вот объяснение того, что я сделал
Я разделил свою функцию на две части. Первый поместил элемент в QList
а второй тасует.
/**
* @brief MenuQuestionnary::assembleQuiz
* @param list
* Asseble a quiz in the Qlist and then ask shuffle to shuffle it...
*/
void MenuQuestionnary::assembleQuiz(QList<Question> &list){
for(int i = 0; i < spinBoxNumberOfQuestion->value(); ++i){
int rand = qrand() * maximumNumberOfQuestionAvailable;
Question newQuestion(rand);
list.append(newQuestion);
}
shuffleQuiz(list);
}
/**
* Method Shuffle
* equivalent to shuffling a deck of cards: we take a random one, move it to be the last one,
* then do it again enough times to have statistically touched every card.
*/
void MenuQuestionnary::shuffleQuiz(QList<Question> &list){
int iters = list.size() * list.size();
for (int i = 0; i < iters; ++i){
int rand = qrand() * list.size();
list.append(list[rand]);
list.removeAt(rand);
}
}
Спасибо за помощь, хотя.