Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Mengelakkan Halimunan Ahli Awam dan Pengulangan Kod Sumber dalam Templat Kelas Diwarisi?

Bagaimana untuk Mengelakkan Halimunan Ahli Awam dan Pengulangan Kod Sumber dalam Templat Kelas Diwarisi?

DDD
DDDasal
2024-11-04 04:49:01805semak imbas

How to Avoid Public Member Invisibility and Source Code Repetition in Inherited Class Templates?

Mengelakkan Kehadiran Ahli Awam dan Pengulangan Kod Sumber dengan Templat Kelas Diwarisi

Dalam pengaturcaraan berorientasikan objek, warisan membenarkan kelas mewarisi sifat dan kaedah daripada kelas induk mereka. Walau bagaimanapun, apabila templat kelas diperkenalkan, ahli awam mungkin menjadi tidak boleh diakses oleh kelas terbitan kerana pematuhan standard C yang ketat. Isu ini boleh membawa kepada masalah apabila cuba merujuk ahli awam dalam kelas terbitan.

Empat penyelesaian sedia ada untuk masalah ini telah dicadangkan:

  • Rujukan awalan dengan CBase
  • Membuka awalan rujukan dengan ini->
  • Menggunakan individu menggunakan pernyataan untuk setiap ahli
  • Melumpuhkan pematuhan C yang ketat

Walaupun penyelesaian ini mungkin menangani isu kebolehaksesan, penyelesaian ini mempunyai potensi kelemahan, seperti kod verbose, panggilan maya yang disekat dan bukan mudah alih.

Cadangan Penyelesaian Dipertingkat

Untuk menambah baik penyelesaian sedia ada, adalah mungkin untuk memanfaatkan makro untuk memudahkan Penyelesaian #3:

<code class="c++">#include <boost/preprocessor.hpp>

#define USING_ONE(r, base, member) \
    using base::member;

#define USING_ALL(base, ...) \
    BOOST_PP_SEQ_FOR_EACH(\
        USING_ONE, base, \
        BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
    )

// Near CBase<BYTES>
#define USING_CBASE(param) USING_ALL(CBase<param>, Arr, Fn1, Fn2, Fn3, Fn4, Fn5)

// In CDerived<BYTES>, in a `public:` section
USING_CBASE(BYTES);</code>

Pendekatan ini memerlukan penambahan makro USING_CBASE berhampiran takrif CBase dan kemudian memanggil makro dalam bahagian awam CDerived. Ia pada asasnya melaksanakan pengisytiharan menyeluruh untuk menjadikan semua ahli terpilih CBase kelihatan dalam CDerived.

Penyelesaian ini menangani kebimbangan Penyelesaian #3, seperti kod berulang, dengan merangkum pernyataan penggunaan ke dalam makro. Ia juga mengekalkan kemudahalihan dengan mematuhi piawaian C. Penyelesaian yang dipertingkat ini menyediakan cara yang lebih ringkas dan cekap untuk mengelakkan halimunan ahli awam dan pengulangan kod sumber dalam templat kelas yang diwarisi.

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Halimunan Ahli Awam dan Pengulangan Kod Sumber dalam Templat Kelas Diwarisi?. 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