Вам не нужно выделять какие-либо string
(хотя, если бы вы это сделали, проблем не возникало).Вы должны выделить Student
.В C ++ нормальный способ выделения массива Student
будет выглядеть следующим образом:
std::vector <Student> students( studentCount );
Аналогично, обычный способ выделения массива int
будет:
std::vector <int> examgrades( examCount );
* 1010.* Для этого потребуется изменить структуру
Student
на что-то вроде:
struct Student
{
std::string name;
std::string letterGrade;
int studentNumber;
std::vector <int> examGrades;
double average;
Student( int examCount ) : examGrades( examCount ) {}
};
Если вы используете указатель для Student::examGrades
, невозможно правильно написать код на C ++, не предоставив оба конструктораи деструктор для Student
.Если вы сделаете вышеизложенное, после того, как вы введете количество студентов и количество экзаменов, все, что вам нужно сделать, это:
std::vector <Student> students( studentCount, Student( examCount ) );
, и все необходимое будет распределено.Или же вы инициализируете вектор пустым и перебираете ввод, используя push_back
для добавления полностью инициализированных учеников.(На самом деле это гораздо лучшее решение, поскольку оно препятствует тому, чтобы любой студент когда-либо существовал без правильной инициализации.)
Если ваш профессор пытается преподавать какое-то другое решение, используя указатели (в этом указатели не должны бытьпрограммы), тогда я бы порекомендовал вам сменить профессора (и, если возможно, уволить этого за некомпетентность).Однако до тех пор вы всегда можете сделать
Student* students = new Student[studentCount];
for ( int i = 0; i != studentCount; ++ i )
students[i].examGrades = new int[examCount];
. Конечно, getData
придется возвращать какой-то struct
, поскольку он должен возвращать указатель на Student
s,плюс studentCount
и examCount
.И где-то вам придется написать код, чтобы удалить всю эту память.(И если вы действительно хотите сделать это правильно, вам придется обернуть большую часть кода во множество try ... catch
блоков, чтобы правильно освободить память, если есть исключение. std::vector
заботится о выделении, удаляети вся обработка исключений для вас.)