Как я могу определить массив char * в структуре в отдельном заголовочном файле? - PullRequest
0 голосов
/ 30 ноября 2011

Я просто собираюсь узнать о структурах и разделить вещи на разные файлы.

На данный момент у меня есть файл Main.cpp, например:

#include <iostream>
    #include "StudentAnswerSheet.hpp"
using std::cout;
using std::endl;

int main(){

    StudentAnswerSheet sheet = {
        "Sally",
        {'a', 'b', 'a', 'd', 'c'}
    };

    cout << sheet.studentName << ":" <<endl;
    for(int i = 0; i <5; i++){
    cout << sheet.studentAnswers[i] << " " ;
    }
    return 0;
}

и отдельный заголовочный файл, который содержит мой тип данных struct StudentAnswerSheet:

#include <string>
using std::string;

struct StudentAnswerSheet{
    string studentName;
    char studentAnswers[5];
};

В идеале Я бы хотел иметь массив до 5 символов для хранения ответов учеников. Я думаю, что мне может понадобиться перейти с char на char *, чтобы получить степень гибкости, но когда я попытался реализовать его, я получил сообщение об ошибке «слишком много инициализаторов для char [0]» и не был уверен, как изменить инициализацию листа. .

Я также не уверен, что лучше всего отслеживать, сколько элементов содержится в моем массиве, если я переключаюсь на массив символов * ... если я беру ответы ученика с помощью cin, я могу отслеживать из числа ответов до 5, но если бы я просто хотел инициализировать ответы самостоятельно, как в данный момент для тестирования, я не уверен, каким будет самый эффективный способ подсчета размера studentAnswers, поэтому любые советы по этому поводу будут очень ценю тоже.

Спасибо за любую помощь!

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Поскольку кажется, что вам разрешено использовать std::string, то почему вы не используете std::vector<char> вместо char[5] или не думаете об использовании char* для гибкости? В вашем случае вы можете просто использовать std::string и затем интерпретировать каждый символ в нем как ответ ученика .

Кроме того, поскольку StudentAnswerSheet не является POD, это означает, что следующее приведет к ошибке компиляции, если вы не используете C ++ 11:

//error in C++98, and C++03; ok in C++11
StudentAnswerSheet sheet = {
    "Sally",
    {'a', 'b', 'a', 'd', 'c'}
};

Вот что я бы сделал:

struct StudentAnswerSheet
{
    std::string studentName;
    std::string studentAnswers;

    //constructor helps easy-initialization of object!
    StudentAnswerSheet(const std::string & name, const std::string & answers) 
                : studentName(name), studentAnswers(answers) {}
              //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
};            // it is called member-initialization list

затем используйте его как:

StudentAnswerSheet sheet("Sally", "abadc");//easy: thanks to the ctor!

std::cout << sheet.studentName << std::endl;
for(size_t i = 0; i < sheet.studentAnswers.size(); ++i)
{
     std::cout << sheet.studentAnswers[i] << " " ;
}
0 голосов
/ 30 ноября 2011

Я не думаю, что вам нужно переключаться, с использованием массива char все в порядке (или вы можете использовать std :: vector). Когда вы используете

char* something[5];

Вы просто инициализируете массив указателей. И когда вы используете

char something[5]; 

вы получаете указатель на массив - " что-то "

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