Хранение массива объектов дочерних классов в файле
Написал простинькую иерархию классов которая реализует класс People и два дочерних класса Teacher и Student. Как мне хранить объекты дочерних классов в файле?
class People
{
protected:
std::string m_name;
int m_age;
std::string m_sex;
public:
People(std::string name = "", int age = 0, std::string sex = "")
: m_name(name), m_age(age), m_sex(sex) {}
std::string getName()
{
return m_name;
}
int getAge()
{
return m_age;
}
std::string getSex()
{
return m_sex;
}
};
class Teacher : public People
{
private:
std::string m_position;
float m_experience;
public:
Teacher(std::string name = "", int age = 0, std::string sex"",
std::string position = "", float experience = 0.0)
: People(name, age, sex),
m_position(position), m_experience(experience) {}
std::string getPosition()
{
return m_position;
}
float getExperience()
{
return m_experience;
}
};
class Student : public People
{
private:
std::string m_faculty;
double m_average_rating;
public:
Student(std::string name = "", int age = 0, std::string sex = "",
std::string faculty = "", double average_rating = 0.0)
: People(name, age, sex),
m_faculty(faculty), m_average_rating(average_rating) {}
std::string getFaculty()
{
return m_faculty;
}
double getAverageRating()
{
return m_average_rating;
}
};
Ответы (1 шт):
Автор решения: Андрей Туманов
→ Ссылка
Если делать свой велосипед, то проще всего таким образом:
- Исхожу из предположения, что данные объектов будут сохраняться в текстовый файл. Если необходимо сохранять в двоичном формате, то тип выходного параметра нужно изменить
- В базовом классе создаем два виртуальных метода getData() возвращающий строку и setData(..) принимающий на вход строку с данными. Эти методы могут быть абстрактными или содержать код, обрабатывающий данные базового класса - зависит от реализации иерархии классов
- Каждый потомок переопределяет методы getData() и setData() с добавлением в возвращаемую строку своих данных и с обработкой принятых данных в соответствии со своей реализацией
- В процессе записи данных в файл записываем последовательно сначала тип данных (объект какого класса сохраняем), если нужно, то длину сохраняемых данных, ну и сами данные, которые возвращает метод getData() сохраняемого объекта
- В процессе чтения данных из файла анализируем тип сохраненного объекта, в соответствии с этим создаем новый экземпляр требуемого класса. Для созданного экземпляра вызываем метод setData() и передаем в него считанную из файла строку