Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Membebankan Operator Kesaksamaan dengan Selamat dalam Hierarki Kelas?
Dalam bidang pengaturcaraan berorientasikan objek, selalunya dikehendaki untuk membandingkan objek kelas yang berkaitan untuk kesamarataan. Walau bagaimanapun, apabila berurusan dengan hierarki kelas, menentukan pendekatan yang betul untuk melebihkan pengendali kesaksamaan boleh menjadi satu cabaran.
Pertimbangkan hierarki kelas berikut:
class A { int foo; virtual ~A() = 0; }; A::~A() {} class B : public A { int bar; }; class C : public A { int baz; };
Terdapat beberapa pendekatan untuk melebihkan beban pengendali kesaksamaan untuk hierarki sedemikian.
Operator beban berlebihan== kerana fungsi percuma membenarkan perbandingan langsung objek tanpa hantaran. Walau bagaimanapun, pendekatan ini menghalang memanfaatkan semakan kesamaan kelas asas (A) untuk kelas terbitan (B dan C).
Menggunakan pendekatan fungsi ahli maya, kelas terbitan boleh mengatasi semakan kesaksamaan. Walau bagaimanapun, ini memerlukan pemutus dinamik untuk mengelak daripada membandingkan objek daripada jenis yang berbeza, yang boleh terasa verbose.
Pendekatan pilihan adalah mengikut prinsip yang digariskan oleh Scott Meyer "Effective C ":
Elakkan mengisytiharkan kelas asas konkrit dan menjadikannya abstrak jika mereka tidak mempunyai pelaksanaan yang lengkap.
Dalam kelas bukan daun, sediakan yang dilindungi fungsi pembantu bukan maya untuk semakan kesaksamaan (cth., isEqual()).
Dalam kelas daun, tentukan beban operator bukan maya awam yang berlebihan yang memanfaatkan pembantu fungsi dalam kelas asas.
bool operator==(const B& lhs, const B& rhs) { return lhs.isEqual(rhs) && lhs.bar == rhs.bar; }
Pendekatan ini menghalang sandaran yang tidak disengajakan dan memastikan keselamatan jenis apabila membandingkan objek daripada jenis yang berbeza.
Untuk semakan kesaksamaan merentas hierarki, pertimbangkan untuk menggunakan fungsi maya tulen dalam kelas asas yang ditindih dalam kelas terbitan.
bool B::pubIsEqual(const A& rhs) const { const B* b = dynamic_cast<const B*>(&rhs); return b != NULL && *this == *b; }
Dengan mematuhi prinsip ini, adalah mungkin untuk mencapai lebihan pengendali kesaksamaan yang mantap dan selamat jenis untuk hierarki kelas yang kompleks.
Atas ialah kandungan terperinci Bagaimana untuk Membebankan Operator Kesaksamaan dengan Selamat dalam Hierarki Kelas?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!