Мне кажется, что компилятор расстраивается из-за того, что вы пытаетесь написать (т.е. присвоить значение) по адресу, к которому у вас нет прав доступа. Я считаю, что ваш конструктор для класса person
может быть виноват из-за того, как этот класс хранит свои переменные, а также заголовок класса:
Конструктор для класса person:
`person::person(){
first_name[CAPACITY] = "";
last_name[CAPACITY] = "";
age[CAPACITY] = 0;
}`
Заголовок класса для персоны класса:
`class person{
public:
//stuff
private:
int capacity = 0;
std::string first_name[CAPACITY];
std::string last_name[CAPACITY];
int age[CAPACITY];
//more stuff
}`
C ++ очень специфичен c в отношении соглашений об именах, поэтому он делает различие между capacity
и CAPACITY
. Из-за этого переменная CAPACITY
не определена в файле Person.h.
Кроме того, поскольку CAPACITY
имеет фиксированное значение в файле Person. cpp, всякий раз, когда вы используете first_name[CAPACITY]
, last_name[CAPACITY]
или age[CAPACITY]
для назначения новых значений, вы обновляете значения только с индексом, равным CAPACITY
, если только вы не обновите само значение CAPACITY
. В предоставленном вами коде CAPACITY
равно 20, поэтому ваша программа пытается обновлять исключительно индекс 20 при каждом вызове метода. Скорее всего, это вызовет проблемы, поскольку класс person
пытается создать свои массивы только в стеке времени выполнения с размером 0 в каждом.
Отдельно кажется, что вам нужен массив людей, но он появляется что вы пытаетесь использовать объект из одного человека для хранения имен и возрастов нескольких людей, создавая все эти массивы. Вместо этого я бы рекомендовал делать first_name
, last_name
и age
не массивами , а отдельными переменными. Затем вы можете манипулировать массивом типа person
, используя переменную CAPACITY
. Вы подошли довольно близко, но вместо этого вы можете объявить его как person myPersonArray[CAPACITY]
(не нужно упоминать "class" перед ним - просто убедитесь, что у вас есть #include "Person.h"
в вашем основном файле. cpp). Когда вы хотите обновить определенного c человека, вы можете выполнить операцию, подобную myPersonArray[updateThisIndexNum].update(newFirstName, newLastName, newAge)
или некоторому логическому эквиваленту.
В качестве последнего замечания, я почти всегда настоятельно рекомендую не использовать !infile.eof()
для управления вашим в то время как l oop при чтении любого файла, потому что eof()
только указывает, пытались ли вы прочитать после конца входного файла . Я очень рекомендую проверить этот пост на Переполнении стека, где люди, намного более знающие, чем я, объясняют, почему это обычно опасно и как этого избежать.