Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menghidupkan Objek C Secara Dinamik daripada Rentetan Nama Kelas?

Bagaimanakah Saya Boleh Menghidupkan Objek C Secara Dinamik daripada Rentetan Nama Kelas?

Susan Sarandon
Susan Sarandonasal
2024-12-19 20:40:10372semak imbas

How Can I Instantiate C   Objects Dynamically from Class Name Strings?

Penyataan Objek Fleksibel daripada Rentetan Nama Kelas

Pengenalan

Dalam pengaturcaraan berorientasikan objek, adalah amalan biasa untuk membuat seketika objek daripada kelas tertentu. Walau bagaimanapun, dalam senario tertentu, ia mungkin berfaedah untuk mencipta objek secara dinamik berdasarkan nama kelas yang disimpan sebagai rentetan. Ini boleh memberikan peningkatan fleksibiliti dan kebolehselenggaraan kod. Artikel ini meneroka kemungkinan untuk mencapai penciptaan objek dinamik ini dalam C .

Pemasangan Objek Dinamik Menggunakan Penukaran Rentetan kepada Jenis

Malangnya, C tidak menyediakan a mekanisme langsung untuk menukar rentetan yang memegang nama kelas kepada maklumat jenis sebenar. Ini bermakna kelas yang ditakrifkan secara statik tidak boleh dijadikan instantiated secara dinamik tanpa perubahan kod yang jelas.

Pendekatan Alternatif

Walaupun penukaran rentetan ke jenis langsung tidak tersedia, terdapat teknik alternatif untuk mencapai penciptaan objek dinamik:

1. Menggunakan Struktur Pemetaan:

Anda boleh membuat pemetaan antara nama kelas (sebagai rentetan) dan penunjuk fungsi yang mencipta tika kelas tersebut. Ini membolehkan penciptaan objek dinamik dengan mencari penunjuk fungsi dan memanggilnya.

template <typename T> Base* createInstance() { return new T; }

std::map<std::string, Base*(*)()> map;
map["DerivedA"] = &createInstance<DerivedA>;  // ... and so on

2. Pendaftaran Kelas Automatik:

Kaedah ini melibatkan pendaftaran kelas semasa penyusunan menggunakan makro atau templat. Kelas berdaftar ditambah secara automatik pada peta global, membolehkan anda mencipta objek daripada mana-mana kelas berdaftar menggunakan namanya.

#define REGISTER_DEC_TYPE(NAME) \
    static DerivedRegister<NAME> reg

#define REGISTER_DEF_TYPE(NAME) \
    DerivedRegister<NAME> NAME::reg(#NAME)

class DerivedB {
    ...;
    REGISTER_DEF_TYPE(DerivedB);
};

3. Menggunakan Varian Boost:

Untuk senario di mana objek jenis yang tidak berkaitan perlu dibuat, perpustakaan Boost menyediakan varian menaip. Jenis ini boleh menyimpan nilai jenis yang berbeza, yang boleh diakses secara dinamik berdasarkan maklumat jenis yang disimpan.

typedef boost::variant<Foo, Bar, Baz> variant_type;
template <typename T> variant_type createInstance() { return variant_type(T()); }

Kesimpulan

Sementara C tidak mempunyai rentetan langsung ke -jenis penukaran, pendekatan alternatif yang dibincangkan dalam artikel ini menyediakan cara untuk mengubah seketika objek secara dinamik daripada rentetan. Dengan menggunakan struktur pemetaan, pendaftaran kelas automatik atau jenis varian Boost, pembangun boleh mencapai fleksibiliti dan kebolehselenggaraan kod yang lebih besar dalam aplikasi berorientasikan objek mereka.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghidupkan Objek C Secara Dinamik daripada Rentetan Nama Kelas?. 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