Bagaimana untuk Membebankan Operator Kesaksamaan dengan Selamat dalam Hierarki Kelas?

Barbara Streisand
Lepaskan: 2024-11-07 04:30:02
asal
303 orang telah melayarinya

How to Safely Overload the Equality Operator in Class Hierarchies?

Operator Overloading untuk Hierarki Kelas: Pendekatan Komprehensif

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;
};
Salin selepas log masuk

Terdapat beberapa pendekatan untuk melebihkan beban pengendali kesaksamaan untuk hierarki sedemikian.

Fungsi Percuma

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).

Fungsi Ahli Maya

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

Abstract Base Kelas

Elakkan mengisytiharkan kelas asas konkrit dan menjadikannya abstrak jika mereka tidak mempunyai pelaksanaan yang lengkap.

Fungsi Ahli Bukan Maya yang Dilindungi

Dalam kelas bukan daun, sediakan yang dilindungi fungsi pembantu bukan maya untuk semakan kesaksamaan (cth., isEqual()).

Fungsi Ahli Bukan Maya Awam

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;
}
Salin selepas log masuk

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;
}
Salin selepas log masuk

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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!