Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mensiri Kelas C dengan std::string Ahli dengan betul?

Bagaimana untuk Mensiri Kelas C dengan std::string Ahli dengan betul?

Susan Sarandon
Lepaskan: 2024-12-03 14:00:20
asal
894 orang telah melayarinya

How to Properly Serialize a C   Class with a std::string Member?

Mensiri Kelas dengan Ahli std::string

Apabila mensiri kelas yang mengandungi std::string, anda mungkin menghadapi " address out of bounds" ralat kerana std::string ialah struktur data dinamik yang menunjuk ke memori yang diperuntukkan timbunan. Menghantar kelas ke char* dan menulisnya ke fail hanya menangkap alamat memori rentetan, bukan kandungan sebenar.

Untuk menyelesaikan isu ini, pertimbangkan pendekatan berikut:

  1. Fungsi Pensirilan Tersuai dan Penyahserikatan:

    Laksanakan batal MyClass::serialize(std::ostream) dan membatalkan MyClass::deserialize(std::istream) fungsi ahli dalam kelas anda. Fungsi ini akan mengendalikan pensirilan dan penyahserikan semua pembolehubah ahli, termasuk std::rentetan.

  2. Logik Pensiri:

    In serialize( ), tulis saiz std::string pada strim, diikuti dengan aksaranya. Ini memastikan bahawa data rentetan disiri secara berasingan daripada objek kelas.

  3. Logik Penyahserian:

    Dalam deserialize(), baca saiz rentetan daripada aliran, diikuti oleh watak-wataknya. Gunakan maklumat ini untuk membina semula objek std::string.

Berikut ialah contoh fungsi sedemikian:

std::ostream& MyClass::serialize(std::ostream &out) const {
    out << height;
    out << ',' << width;
    out << ',' << name.size();
    out << ',' << name;
    return out;
}
std::istream& MyClass::deserialize(std::istream &in) {
    if (in) {
        in >> height;
        in >> width;
        int len;
        in >> len;
        name.resize(len);
        in >> name;
    }
    return in;
}
Salin selepas log masuk
  1. Strim Lebih Muatan Operator:

    Untuk penggunaan yang mudah, anda juga boleh membebankan operator strim untuk kelas anda:

std::ostream &operator<<(std::ostream& out, const MyClass &obj) {
    obj.serialize(out); return out;
}
std::istream &operator>>(std::istream& in, MyClass &obj) {
    obj.deserialize(in); return in;
}
Salin selepas log masuk

Dengan melaksanakan fungsi bersiri dan penyahsirian tersuai, anda boleh mensiri dan menyahsiri kelas dengan cekap dan boleh dipercayai yang mengandungi std::strings.

Atas ialah kandungan terperinci Bagaimana untuk Mensiri Kelas C dengan std::string Ahli dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan