مقدمة
في البرمجة الموجهة للكائنات، من الشائع إنشاء مثيل كائنات من فئات محددة. ومع ذلك، في بعض السيناريوهات، قد يكون من المفيد إنشاء كائنات ديناميكيًا استنادًا إلى أسماء الفئات المخزنة كسلاسل. يمكن أن يوفر ذلك المزيد من المرونة وقابلية صيانة التعليمات البرمجية. تستكشف هذه المقالة إمكانيات تحقيق إنشاء هذا الكائن الديناميكي في لغة C.
إنشاء كائن ديناميكي باستخدام تحويل السلسلة إلى النوع
لسوء الحظ، لا توفر لغة C أصلاً آلية مباشرة لتحويل السلاسل التي تحمل أسماء الفئات إلى معلومات النوع الفعلية. وهذا يعني أنه لا يمكن إنشاء مثيل للفئات المحددة بشكل ثابت ديناميكيًا بدون تغييرات صريحة في التعليمات البرمجية.المناهج البديلة
على الرغم من عدم توفر التحويل المباشر من سلسلة إلى نوع، إلا أن هناك تقنيات بديلة لتحقيق إنشاء كائن ديناميكي:1. استخدام بنية التعيين:
يمكنك إنشاء تعيين بين أسماء الفئات (كسلاسل) ومؤشرات الوظائف التي تنشئ مثيلات لتلك الفئات. يسمح هذا بإنشاء كائن ديناميكي من خلال البحث عن مؤشر الوظيفة واستدعائه.templatetemplateBase* createInstance() { return new T; } std::map<:string base> map; map["DerivedA"] = &createInstance ; // ... and so on
2. تسجيل الفصول تلقائيًا:
تتضمن هذه الطريقة تسجيل الفئات أثناء التجميع باستخدام وحدات الماكرو أو القوالب. تتم إضافة الفئات المسجلة تلقائيًا إلى الخريطة العالمية، مما يجعل من الممكن إنشاء كائنات من أي فئة مسجلة باستخدام اسمها.#define REGISTER_DEC_TYPE(NAME) \ تسجيل مشتق ثابت#define REGISTER_DEC_TYPE(NAME) \ static DerivedRegisterreg #define REGISTER_DEF_TYPE(NAME) \ DerivedRegister NAME::reg(#NAME) class DerivedB { ...; REGISTER_DEF_TYPE(DerivedB); };
3. استخدام Boost Variant:
بالنسبة للسيناريوهات التي تحتاج إلى إنشاء كائنات من أنواع غير مرتبطة، توفر مكتبة Boost نوعًا متغيرًاtemplateBase* createInstance() { return new T; } std::map<:string base> map; map["DerivedA"] = &createInstance ; // ... and so on
الاستنتاج
بينما تفتقر لغة C إلى التحويل المباشر من سلسلة إلى نوع، فإن الأساليب البديلة التي تمت مناقشتها في هذه المقالة توفر وسيلة لإنشاء كائنات ديناميكيًا من السلاسل. من خلال استخدام هياكل التعيين، أو التسجيل التلقائي للفئات، أو نوع متغير Boost، يمكن للمطورين تحقيق قدر أكبر من المرونة وقابلية صيانة التعليمات البرمجية في تطبيقاتهم الموجهة للكائنات.تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3