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
Susan Sarandonasal
2024-12-03 14:00:20805semak imbas

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;
}
  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;
}

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:
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