Mensiri Kelas yang Mengandungi std::string: Memahami Dilema Penunjuk
Serialization ialah teknik penting yang digunakan untuk mengekalkan keadaan objek untuk penyimpanan atau pemindahan. Walau bagaimanapun, kelas bersiri yang mengandungi std::strings membentangkan cabaran kerana sifat penunjuk std::strings.
Isu timbul apabila cuba mensiri kelas yang mengandungi std::strings dengan menghantarnya ke char * dan menulisnya ke fail. Pendekatan ini berfungsi untuk jenis data mudah tetapi gagal dengan std::strings kerana ia tidak mempertimbangkan kebergantungan penunjuk.
Penyelesaian Standard untuk Pensirilan Penunjuk
Untuk mengatasi isu ini, penyelesaian standard melibatkan memperkenalkan kaedah bersiri dan penyahserikan ke dalam kelas. Kaedah ini mengendalikan penulisan dan pembacaan data dalaman objek secara manual, termasuk penunjuk.
Contoh pelaksanaan mungkin seperti berikut:
// Serialization method std::ostream& MyClass::serialize(std::ostream &out) const { // Serialize numeric values using the output stream out << height; out << ',' // Separator out << width; out << ',' // Separator // Serialize the std::string out << name.size(); // String length out << ',' // Separator out << name; // String characters return out; } // Deserialization method std::istream& MyClass::deserialize(std::istream &in) { if (in) { // Deserialize numeric values using the input stream int len=0; char comma; in >> height; in >> comma; // Separator in >> width; in >> comma; // Separator // Deserialize the std::string in >> len; // String length in >> comma; // Separator if (in && len) { std::vector<char> tmp(len); in.read(tmp.data() , len); // String characters name.assign(tmp.data(), len); } } return in; }
Melebihi beban pengendali strim boleh memudahkan penggunaan ini kaedah:
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 menggunakan teknik ini, std::strings boleh disiri dan dinyahsiri dengan berkesan sebagai sebahagian daripada kelas yang lebih besar, memelihara integriti dan kebergantungan penunjuk mereka.
Atas ialah kandungan terperinci Bagaimana untuk Mensiri Kelas yang Mengandungi std::string dalam C dengan betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!