"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكنني إنشاء كائنات C++ ديناميكيًا من سلاسل اسم الفئة؟

كيف يمكنني إنشاء كائنات C++ ديناميكيًا من سلاسل اسم الفئة؟

تم النشر بتاريخ 2024-12-25
تصفح:521

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

إنشاء كائن مرن من سلاسل اسم الفئة

مقدمة

في البرمجة الموجهة للكائنات، من الشائع إنشاء مثيل كائنات من فئات محددة. ومع ذلك، في بعض السيناريوهات، قد يكون من المفيد إنشاء كائنات ديناميكيًا استنادًا إلى أسماء الفئات المخزنة كسلاسل. يمكن أن يوفر ذلك المزيد من المرونة وقابلية صيانة التعليمات البرمجية. تستكشف هذه المقالة إمكانيات تحقيق إنشاء هذا الكائن الديناميكي في لغة C.

إنشاء كائن ديناميكي باستخدام تحويل السلسلة إلى النوع

لسوء الحظ، لا توفر لغة C أصلاً آلية مباشرة لتحويل السلاسل التي تحمل أسماء الفئات إلى معلومات النوع الفعلية. وهذا يعني أنه لا يمكن إنشاء مثيل للفئات المحددة بشكل ثابت ديناميكيًا بدون تغييرات صريحة في التعليمات البرمجية.

المناهج البديلة

على الرغم من عدم توفر التحويل المباشر من سلسلة إلى نوع، إلا أن هناك تقنيات بديلة لتحقيق إنشاء كائن ديناميكي:

1. استخدام بنية التعيين:

يمكنك إنشاء تعيين بين أسماء الفئات (كسلاسل) ومؤشرات الوظائف التي تنشئ مثيلات لتلك الفئات. يسمح هذا بإنشاء كائن ديناميكي من خلال البحث عن مؤشر الوظيفة واستدعائه.

template Base* createInstance() { return new T; } std::map<:string base> الخريطة; Map["DerivedA"] = &createInstance; // ... وهكذا
template  Base* createInstance() { return new T; }

std::map<:string base> map;
map["DerivedA"] = &createInstance;  // ... and so on

2. تسجيل الفصول تلقائيًا:

تتضمن هذه الطريقة تسجيل الفئات أثناء التجميع باستخدام وحدات الماكرو أو القوالب. تتم إضافة الفئات المسجلة تلقائيًا إلى الخريطة العالمية، مما يجعل من الممكن إنشاء كائنات من أي فئة مسجلة باستخدام اسمها.

#define REGISTER_DEC_TYPE(NAME) \ تسجيل مشتق ثابت reg #تعريف REGISTER_DEF_TYPE(NAME) \ مشتقتسجيل NAME::reg(#NAME) فئة مشتقة ب { ...; REGISTER_DEF_TYPE(DerivedB); };
#define REGISTER_DEC_TYPE(NAME) \
    static DerivedRegister reg

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

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

3. استخدام Boost Variant:

بالنسبة للسيناريوهات التي تحتاج إلى إنشاء كائنات من أنواع غير مرتبطة، توفر مكتبة Boost نوعًا متغيرًا . يمكن أن يحتوي هذا النوع على قيم من أنواع مختلفة، والتي يمكن الوصول إليها ديناميكيًا بناءً على معلومات النوع المخزنة.

typedef Boost::variantvariant_type; القالب variant_type createInstance() { returnvariant_type(T());
template  Base* createInstance() { return new T; }

std::map<:string base> map;
map["DerivedA"] = &createInstance;  // ... and so on

الاستنتاج

بينما تفتقر لغة C إلى التحويل المباشر من سلسلة إلى نوع، فإن الأساليب البديلة التي تمت مناقشتها في هذه المقالة توفر وسيلة لإنشاء كائنات ديناميكيًا من السلاسل. من خلال استخدام هياكل التعيين، أو التسجيل التلقائي للفئات، أو نوع متغير Boost، يمكن للمطورين تحقيق قدر أكبر من المرونة وقابلية صيانة التعليمات البرمجية في تطبيقاتهم الموجهة للكائنات.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3