Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mensiri Kelas C dengan std::string Ahli dengan betul?
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:
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.
Logik Pensiri:
In serialize( ), tulis saiz std::string pada strim, diikuti dengan aksaranya. Ini memastikan bahawa data rentetan disiri secara berasingan daripada objek kelas.
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; }
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!