Как правильно передать значения массива объектов в другой в C ++? - PullRequest
0 голосов
/ 19 апреля 2019

Итак, я пытаюсь сделать телефонную книгу прямо сейчас, и одной из моих задач было прочитать информацию людей в текстовом файле. Когда я вызываю функцию в моем main.cpp, мой массив объектов не получает данные из текстового файла. Я создал scratch.cpp для проверки метода, который пытаюсь использовать, и он работает, но как только я пытаюсь использовать его в своей программе, он не работает должным образом.

Я создал scratch.cpp для проверки метода, который пытаюсь использовать, и он работает, но как только я пытаюсь использовать его в своей программе, он не работает должным образом.

Это должно изменить значение массива

void TxtReader::read(Contacts* &contacts){
    Contacts *contacts2 = new Contacts[0];
    int contactSize = 0;
    std::string firstName;
    std::string lastName;
    std::string phoneNumber;
    std::string birthPlace;
    std::string birthDate;
    std::string Profession;
    std::ifstream savedContacts("ContactList.txt");
    Contacts newContact = Contacts();
    do {
        std::getline(savedContacts, firstName, ';');
        std::getline(savedContacts, lastName, ';');
        std::getline(savedContacts, phoneNumber, ';');
        std::getline(savedContacts, birthPlace, ';');
        std::getline(savedContacts, birthDate, ';');
        std::getline(savedContacts, Profession, ';');
        newContact.setFirstname(firstName);
        newContact.setLastname(lastName);
        newContact.setPhonenumber(phoneNumber);
        newContact.setBirthplace(birthPlace);
        newContact.setBirthdate(birthDate);
        newContact.setProfession(Profession);
        pushContact(contacts2, newContact, contactSize);
    } while (std::getline(savedContacts, firstName));
    delete[] contacts;
    contacts = contacts2;
    delete[] contacts2;
}

и вот как я назвал это в другом классе

void ContactDir::getList() {
    textReader.read(contacts);
}

и затем я использовал это в моем main.cpp

Мне показалось, что все в порядке, программу можно скомпилировать, но она падает, когда попадает в функцию getList.

Отладчик показывает несколько ошибок, таких как: «this = -var-create: невозможно создать переменный объект» в основном, и «Сигнал = SIGSEGV (Ошибка сегментации)» в функции TxtReader :: read и в классе Contacts. а также я получил такие ошибки, как "firstName = (std :: _ cxx11 :: string)" "" в контактах и ​​контактах2 и объектах newContact

В классе Contacts есть сеттеры и геттеры, подобные этому:

Contacts::Contacts() {}

void Contacts::setFirstname(std::string firstName) {
    this->firstName = firstName;
}

std::string Contacts::getFirstname() {
    return firstName;
}

1 Ответ

1 голос
/ 19 апреля 2019

Ваша проблема двоякая. Сначала это:

Contacts *contacts2 = new Contacts[0];

Это распределение нулевого размера. Вы ничего не можете сохранить в contacts2, поскольку он имеет нулевой размер.

Но даже если его размер не равен нулю, у вас также есть это:

contacts = contacts2;
delete[] contacts2;

contacts указывает на contacts2, который вы удаляете, поэтому contacts указывает на удаленную память. Так что либо не удаляйте contacts2, либо (намного лучше) не используйте new и не используйте delete. Вместо этого используйте std::vector для хранения ваших объектов. Например, ваша read() функция может принимать ссылку на вектор Contacts:

void TxtReader::read(std::vector<Contacts>& contacts);

И ваши временные объекты также будут векторами:

std::vector<Contacts> contacts2;

Назначение:

контакты = контакты2;

будет работать так, как задумано, поскольку будет копировать объекты.

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