Определение массива символов в заголовочном файле в C ++ - PullRequest
0 голосов
/ 22 сентября 2018

Я работаю над проектом, в котором вопрос отображается в игровом окне.

Поскольку этот вопрос нужно будет сильно изменить, я думаю, было бы проще иметь 5 определенных строк текста (1для вопроса, 4 для ответов MC), которые просто редактируются при каждом изменении вопроса.

Я пробовал это в файле заголовка:

struct tagQuestion{
    int x, y;
    const char* qLine[150];
    char ansA[150];
    char ansB[150];
    char ansC[150];
    char ansD[150];

}question[1];

, затем в моем main.cpp

question.qLine[150] = "TEST PHRASE";

но он возвращает ошибку "qLine" in "question", which is of non-class type "tagQuestion[1]"

Я попытался char и const char* безуспешно.

Я пытаюсь следовать примерув моем учебнике, и я думаю, что я неправильно понимаю.

Как только я объявил массив символов в заголовочном файле, я не могу отредактировать его содержимое в основном файле?

1 Ответ

0 голосов
/ 22 сентября 2018
  1. То, что [1] после question, кажется, не имеет никакого смысла.Удалите его.

  2. Ваши ответы - это массивы char, но ваш вопрос представляет собой массив указателей на char.Я уверен, что вы не хотите, чтобы ваш вопрос состоял из 150 указателей на символы.

  3. Если вы хотите изменить qLine, не устанавливайте его const.

  4. qLine[150] = ... Это присваивает значение 151-му элементу массива из 150 элементов.Ни то, что вы хотите, ни правовой кодекс.Вы, вероятно, хотите qLine =, но это не работает с массивом, вместо этого вам нужно использовать функцию типа strcpy, которая записывает данные в массив, но я настоятельно рекомендую против этого.(см. следующий пункт)

  5. Не используйте C в C ++.Используйте std::string, а не массивы char.

  6. Если у вас есть строки, которые регулярно меняются, создайте файл, в котором хранятся ваши строки, загрузите их в карту и вытяните ихс карты, где бы они ни находились, вместо того, чтобы вставлять жестко закодированные строки в ваш код.Таким образом, вам не нужно менять какой-либо код, когда вы изменяете текст.

Я предлагаю что-то вроде этого:

struct Question {
    std::string text;
    std::vector<std::string> answers;
};

std::map<std::string, Question> questions;

А затем что-то вроде этого:

ifstream questionsFile("questions.txt");
if (questionsFile.is_open())
{
    std::string line;
    while (std::getline(questionsFile, line))
    {
        // Split line into some id, text and answers, how exactly depends on the format you chose
        std::string id = ...;
        Question question;
        question.text = ...;
        question.answers.push_back(...);
        questions[id] = question;
    }
    questionsFile.close();
}
else
{
    // Handle error
}

И где бы в вашем коде не было:

// Print question with id "q1":
std::cout << questions["q1"].text << std::endl;

// Print answer #2 for question with id "q1":
std::cout << questions["q1"].answers[1] << std::endl;

Еще лучше было бы сделать Question классом, который скрывает свои внутренние компоненты и имеет методы доступа и конструктор или статический метод длясоздавать новые экземпляры из допустимых строк с правильной обработкой ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...