У меня проблема с загрузкой объектов из файла .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&
но тогда я получаю сообщение об ошибке, что ни один операнд не соответствует этим операндам, потому что ему нужны Адрес * и Дата *.
Есть ли у вас какие-либо идеи относительно того, как я могу обойти эту проблему?