Невозможно полностью прочитать объект из txt файла в массив, объект создан из двух разных структур - PullRequest
0 голосов
/ 02 ноября 2019

У меня проблема с загрузкой объектов из файла .txt обратно в массив. У меня есть человек с личными атрибутами: std::string _name std::string _lastName Address* _residence и Date* _birthDate. Он правильно читает имя и фамилию, затем переходит к другому перегруженному оператору >>, а затем падает, потому что у него нет адреса.

Это моя функция загрузки файла:

void loadFile() {
    std::vector<Person> people;
    Person temp;
    std::ifstream myFile("test.txt");
    if (myFile.is_open())
    {
        while (myFile >> temp)
        {
            people.push_back(temp);
        }
        myFile.close();
    }
    else {
        std::cout << "Unable to open file" << std::endl;
    }
};

Этомой Person.cpp с оператором >>:


Person::Person(std::string name, std::string lastName, Address* residence, Date* birthDate)
{
    this->_name = name;
    this->_lastName = lastName;
    this->_residence = residence;
    this->_birthDate = birthDate;
}

Person::Person()
{
}

std::ostream& operator<<(std::ostream& os, const Person& p)
{
    os << p._name << " " << p._lastName << std::endl << p._birthDate << std::endl << p._residence << std::endl;
    return os;
}

std::istream& operator>>(std::istream& is, Person& p)
{
    is >> p._name;
    is >> p._lastName;
    is >> p._birthDate; // <- here it crashes
    is >> p._residence;
    return is;
}

Вот класс Date.cpp с атрибутами и перегруженным оператором >>

#include "Date.h"

Date::Date(int day, int month, int year)
{
    this->_day = day;
    this->_month = month;
    this->_year = year;
}
std::ostream& operator<<(std::ostream& os, const Date* d)
{
    os << d->_day << ". " << d->_month << ". " << d->_year;
    return os;
}
std::istream& operator>>(std::istream& is, Date &d)
{
    is >> d._day;
    is >> d._month;
    is >> d._year;
    return is;
}

А вот Address.cpp с атрибутами и перегруженнымoperator >>:

#include "Address.h"

Address::Address(std::string street, std::string city, std::string zip)
{
    this->_street = street;
    this->_city = city;
    this->_zip = zip;
}

std::ostream& operator<<(std::ostream& os, const Address* dt)
{
    os << dt->_city << ", " << dt->_street << ", " << dt->_zip;
    return os;
}
std::istream& operator>>(std::istream& is, Address& dt)
{
    is >> dt._city;
    is >> dt._street;
    is >> dt._zip;
    return is;
}

Я знаю, что мне нужен адрес для редактирования (или добавления) атрибутов указанной структуры, я уже пытался переключить Address* на Address& и Date* на Date& но тогда я получаю сообщение об ошибке, что ни один операнд не соответствует этим операндам, потому что ему нужны Адрес * и Дата *.

Есть ли у вас какие-либо идеи относительно того, как я могу обойти эту проблему?

...