Mengakses Ahli Kelas Persendirian dari Luar Kelas dalam C
Walaupun secara amnya disyorkan untuk mengekalkan pengkapsulan dengan memastikan ahli kelas peribadi, terdapat situasi di mana anda mungkin tertanya-tanya sama ada boleh mengaksesnya dari luar kelas. Walaupun terdapat risiko yang berkaitan dengan pendekatan sedemikian, mari kita terokai sama ada ia boleh dilakukan dalam C .
Offset Penunjuk: Percubaan Naif
Sesetengah percaya bahawa menggunakan offset penunjuk boleh memberikan akses kepada ahli kelas persendirian. Walau bagaimanapun, kaedah ini bergantung pada platform dan terdedah kepada ralat, kerana reka letak kelas mungkin berbeza-beza merentas penyusun dan seni bina yang berbeza.
Pengkhususan Templat: Helah Mengejutkan
Agak agak pendekatan tidak konvensional melibatkan pengkhususan fungsi ahli templat. Dengan mengkhususkan fungsi ahli templat tertentu, anda boleh memperoleh akses kepada ahli persendirian kelas dengan berkesan, walaupun mereka pada mulanya diisytiharkan peribadi oleh pembangun asal.
Pertimbangkan contoh berikut:
class safe { int money; public: safe() : money(1000000) {} template <typename T> void backdoor() { // Do some stuff. } };
Dalam kod di atas, fungsi pintu belakang diisytiharkan sebagai fungsi ahli templat. Untuk mengakses wang dari luar kelas, kita boleh membuat pengkhususan fungsi ini:
#include <iostream> class key; template <> void safe::backdoor<key>() { // My specialization. money -= 100000; std::cout << money << "\n"; } int main() { safe s; s.backdoor<key>(); s.backdoor<key>(); }
Output:
900000 800000
Dalam contoh ini, dengan mengkhususkan fungsi pintu belakang dengan templat kunci hujah, kami boleh mengubah suai wang ahli persendirian dari luar kelas. Ambil perhatian bahawa teknik ini masih tidak dianggap sebagai amalan yang baik dan harus dielakkan dalam kebanyakan kes.
Atas ialah kandungan terperinci Bolehkah Pengkhususan Templat Digunakan untuk Mengakses Ahli Kelas C Persendirian?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!