Как и вообще возможно ли сохранить объект класса в файл

Как и вообще возможно ли сохранить объект класса в файл целиком
fin.write((char*)&obj, sizeof(class)); тут как я понимаю работать не будет Класс объект которого нужно сохранить

ниже классы которые используются

class Plane
{
public:
    Plane()=default;
    ~Plane() = default;
    std::string getNumber() const { return number; }
    std::string getBrand()const { return brand; }
    std::string getReleaseDate()const { return releaseDate; }
    double getCarrying()const { return carrying; }
    size_t getPassengersCount()const { return passengersCount; }
    friend std::istream& operator>>(std::istream& in, Plane&);
    friend std::ostream& operator<<(std::ostream& out, const Plane&);
    void changeItem();
private:
    std::string number;
    std::string brand;
    std::string releaseDate;
    int carrying;
    int passengersCount;
    
};


    class Pilot
{
public:
    Pilot() = default;
    ~Pilot() = default;
    std::string getSurname()const { return surname; }
    size_t getworkExperienceYears() const { return workExperienceYears; }
    std::string getAddress()const { return address; }
    std::string getDateOfBirth()const { return DateOfBirth; }
    double getSalary()const { return salary; }
    friend std::istream& operator>>(std::istream& in, Pilot&);
    friend std::ostream& operator<<(std::ostream& out, const Pilot&);
     void changeItem();
private:
    std::string surname;
    size_t workExperienceYears;
    std::string address;
    std::string DateOfBirth;
    double salary;
};

class Flight 
{
public:
    Flight() = default;
    ~Flight() = default;
    void setPilotandPlane(Pilot& pi, Plane& pl) { pilot = pi, plane = pl; pilotSurname = pi.getSurname(), planeNumber = pl.getNumber(), planeBrand = pl.getBrand(), cargoWeight = pl.getCarrying(); }
    void changeItem();
    std::string getflightNumber()const { return flightNumber; }
    std::string getFinishDate()const { return finishDate; }
    std::string getStartDate() const { return startDate; }
    std::string getPilotSurname()const { return pilotSurname; }
    std::string getPlaneNumber()const { return planeNumber; }
    std::string getPlaneBrand() const { return planeBrand; }
    double getKm()const { return km; }
    double getCost()const { return cost; }
    std::string getStartPoint()const { return startPoint; }
    std::string getFinishPoint() const { return finishPoint; }
    size_t getCountOfStops() const { return countOfStops; }
    size_t getCountOfSoldTickets() const { return countOfSoldTickets; }
    size_t getCargoWeight() const { return cargoWeight; }
    Pilot& getPilot() { return pilot; };
    Plane& getPlane() { return plane; };
    friend std::istream& operator>>(std::istream& in, Flight& flight);
    friend  std::ostream& operator<<(std::ostream& out, const Flight& flight);
protected:
    Pilot pilot;
    Plane plane;
    std::string flightNumber;
    std::string finishDate;
    std::string startDate;
    std::string pilotSurname;
    std::string planeNumber;
    std::string planeBrand;
    double km;
    double cost;
    std::string startPoint;
    std::string finishPoint;
    size_t countOfStops;
    size_t countOfSoldTickets;
    size_t cargoWeight;
};

Ответы (2 шт):

Автор решения: Alexey Nikolaev

Для того, чтобы сохранить класс в файл, необходимо упаковать содержимое класса так, чтобы при чтении данных можно было восстановить его на любой системе с различными порядками байт. Этот процесс называется сериализацией, соответственно восстановление класса из упакованных данных называется десериализацией.

В С++ "из коробки" не предусмотрено механизма сериализации, но есть много сторонних библиотек, позволяющих это сделать. Самые известные - это:

  1. Protobuf (разработка Google) github.

  2. Компонента библиотеки boost - Serialization.

→ Ссылка
Автор решения: EOF

Целиком не получится, потому что vector и string хранят в себе указатель на память в куче. При записи будут записываться именно указатели, а не данные. Чтобы записать string в бинарный файл, необходимо сначала записать количество симолов (т.е. size() строки), а потом записать это количество символов. Также и для vector. Сначала реализуйте функции для записи классов компонентов, а потом скомпонуйте эти функции внутри функции записи класса агрегатора.


Вот код записи обьекта класса Plane:

size_t str_size = number.size() + 1;
file.write(reinterpret_cast<char*>(&str_size), sizeof(size_t));
file.write(reinterpret_cast<char*>(number.c_str()), str_size);

str_size = brand.size() + 1;
file.write(reinterpret_cast<char*>(&str_size), sizeof(size_t));
file.write(reinterpret_cast<char*>(brand.c_str()), str_size);

str_size = releaseDate.size() + 1;
file.write(reinterpret_cast<char*>(&str_size), sizeof(size_t));
file.write(reinterpret_cast<char*>(releaseDate.c_str()), str_size);

file.write(reinterpret_cast<char*>(&carrying), sizeof(int));
file.write(reinterpret_cast<char*>(&passengersCount), sizeof(int));
→ Ссылка