سؤال

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

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

هل كانت مفيدة؟

المحلول

هل تبحث عن تسجيل فئة وقت التشغيل C++؟لقد وجدت هذا وصلة (دعم).

من المحتمل أن يحقق ذلك ما تريده، لست متأكدًا من الوحدات المحملة ديناميكيًا وما إذا كان يمكنك تسجيلها باستخدام نفس الطريقة أم لا.

نصائح أخرى

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

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

يبدو هذا مكانًا لاستخدام "تعدد أشكال وقت الترجمة" أو معلمات سياسة القالب.

شاهد تصميم C++ الحديث بواسطة Andrei Alexandrescu وفريقه لوكي التنفيذ على أساس الكتاب.أنظر أيضاً لوكي الصفحة في ويكيبيديا.

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

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

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

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

std::string foo = "Derived1";Base * object = "foo" الجديد؛// أو أي تدوين تفضله - لا يعمل في لغة C++

فإن القدرة على معرفة ما إذا كان قد تم تجميع "Derived1" أم لا سيكون مفيدًا.نظرًا لأنه يتعين عليك تحديد الفصل مباشرةً، مثل:

Base * object = new Derived1;// يعمل في لغة C++

تتم جميع عمليات التحقق في وقت الترجمة.

إذا كان لكل فصل مكتبة ديناميكية خاصة به، فما عليك سوى التحقق من وجود المكتبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top