Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mengelak Kehaliman Ahli dan Kembung Kod Sumber dalam Templat Kelas Diwarisi?

Bagaimanakah Saya Boleh Mengelak Kehaliman Ahli dan Kembung Kod Sumber dalam Templat Kelas Diwarisi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-01 05:38:27178semak imbas

How Can I Avoid Member Invisibility and Source Code Bloat in Inherited Class Templates?

Mengelakkan Halimunan Ahli dan Kembung Kod Sumber dengan Templat Kelas Diwarisi

Masalah yang dihadapi berlaku apabila templat kelas, CDerived, mewarisi daripada asas templat kelas, CBase dan semua ahli awam CBase menjadi tidak kelihatan kepada CDerived apabila kod disusun dengan pematuhan C standard didayakan.

Penyelesaian kepada Masalah:

Penyelesaian #1: Kelayakan Eksplisit

Rujukan awalan kepada ahli CBase dalam CDerived dengan CBase::, mis., Fn1() menjadi CBase::Fn1(). Ini memaksa carian nama berlaku dalam skop kelas asas, menjadikan ahli kelihatan. Walau bagaimanapun, penyelesaian ini memerlukan banyak penambahan kata-kata pada kod, yang membawa kepada kembung kod sumber.

Penyelesaian #2: this-> Awalan

Rujukan awalan kepada ahli CBase dengan ini->, mis., Fn1() menjadi ini->Fn1(). Ini juga menjadikan ahli kelihatan, tetapi sekali lagi memerlukan pengubahan kod verbose.

Penyelesaian #3: Menggunakan Penyata

Tambah menggunakan pernyataan di dalam CDerived untuk mengimport ahli CBase, mis., menggunakan CBase::Fn1; menggunakan CBase::Fn2;. Ini memerlukan hanya satu pernyataan penggunaan bagi setiap ahli yang digunakan dalam CDerived, tetapi pernyataan menyeluruh untuk mengimport semua ahli tidak wujud.

Penyelesaian #4: Mod Permisif Bukan Standard

Lumpuhkan pematuhan C yang ketat dalam tetapan pengkompil untuk menyekat isu carian nama. Walau bagaimanapun, ini adalah penyelesaian global yang melepaskan diri daripada standard dan tidak mudah alih.

Penyelesaian yang Lebih Ringkas #5:

Untuk mengurangkan keterlaluan Penyelesaian # 3, makro boleh digunakan untuk menjana penyataan menggunakan yang diperlukan.

Pelaksanaan:

Sertakan perpustakaan prapemproses Boost dan tentukan makro, USING_ONE, untuk menjana satu penggunaan pernyataan untuk ahli asas tertentu.

Tentukan makro lain, USING_ALL, untuk menjana urutan penggunaan pernyataan untuk semua ahli asas yang ditentukan.

Dalam templat kelas asas, tentukan makro, USING_CBASE, untuk menjana pernyataan penggunaan untuk semua ahli yang dilindungi dan awam yang akan digunakan dalam templat kelas terbitan.

Dalam templat kelas terbitan, gunakan makro USING_CBASE yang sesuai untuk mengimport ahli yang diperlukan menggunakan makro yang ditakrifkan sebelum ini. Proses ini memerlukan carian dan menaip yang minimum, mengurangkan kelebihan kod sumber sambil mengekalkan kemudahalihan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengelak Kehaliman Ahli dan Kembung 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