إنشاء مثيل فئة مشتقة من سلسلة من اسمها. (أي ، انعكاس)

StackOverflow https://stackoverflow.com/questions/4231205

سؤال

إذا كان لدي فئة قاعدة:

class Base 
{
public:
virtual void Test()=0;
};

وفي وحدة تم تحميلها ديناميكيًا (.so/.dll) ، قمت بتطبيق فئة مستمدة من هذا:

class SomethingFromBase : Base 
{
...
};

والمستخدم ، بمجرد تحميل هذه المكتبة ، يطلب إنشاء مثيل SomethingFromBase (دعنا نقول أننا نحصل على الاسم من CIN.) ، وليس لدينا أي معرفة بـ SomethingFromBase (أي ، لا توجد طريقة للقيام فقط if(inputstr == "SomethingFrombase") { ... } هل هناك أي طريقة لإنشاء مثيل لشيء من فرومز؟

أنا متأكد تمامًا من أن هذا مستحيل في (قياسي) C ++ ، لكنني آمل دائمًا أن أفاجئني!

إذا كان ذلك ممكنًا مع إضافة بعض المكتبة ، فلا يزال أود أن أعرف ذلك. شكرًا!

يحرر: انظر إجابة Cdhowie. أدلة لتنفيذ هذه التقنية:http://www.linuxjournal.com/article/3687؟page=0،1http://www.abstraction.net/viewarticle.aspx؟articleid=67

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

المحلول

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

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

لذلك هذا ليس انعكاسًا "حقيقيًا" ، لكن يمكنك اختراقه يدويًا إلى حد ما. انظر ، على سبيل المثال ، Pidgin ، والذي يسمح بمواصفات الإضافات البروتوكول التي قد توفر العديد من الإدخالات في قائمة البروتوكول.

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

نصائح أخرى

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

//Creatable.h
#define IMPLEMENT_CREATABLE( ClassName ) \
  ObjectMap::Instance().Add( string(ClassName), new ClassName );

//ObjectMap.h. This is a singleton
class ObjectMap
{
  ...........
  map<string, Creatable *> myMap;
  ...........
public:
  void Add( const string &className, Creatable * );
  Creatable * Get( const string &className );
};

//My Class.h
class MyClass : public Creatable
{
  ................
};

//My Class.cpp
IMPLEMENT_CREATABLE(MyClass);


//Client.cpp
string className;
cin>>className;
Creatable *anObject = ObjectMap::Instance().Get( className );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top