Reflection C++

13/09/2011 - 13:45 von Matthias | Report spam
Hallo zusammen,

ich habe Klassennamen und Methodennamen in einem XML-File als String
stehen. Zur Laufzeit möchte ich aus diesen Strings Objekte
instanziieren und die Methode (die auch als String im XML-File steht)
aufrufen.
In Java kann ich das machen über getClass().getMethod(...). Wie kann
ich das in C++ realisieren.
Ich habe von Qt gelesen. In einem Forum habe ich gelesen doch besser
die Reflex-Api von CERN zu nehmen, da Qt noch den Metacompiler hat.
Wie kann ich das am einfachsten realisieren?
Am liebsten wàre mir so ein einfacher Aufruf wie in Java
getClass().getMethod...

Ich benutze ANSI-C++ kann aber zur Not die MFC dazunehmen (falls es
einfacher wàre), besser wàre es aber bei ANSI-C++ zu bleiben.

Viele Grüße, Matthias
 

Lesen sie die antworten

#1 Edzard Egberts
13/09/2011 - 17:46 | Warnen spam
Matthias schrieb:
ich habe Klassennamen und Methodennamen in einem XML-File als String
stehen. Zur Laufzeit möchte ich aus diesen Strings Objekte
instanziieren und die Methode (die auch als String im XML-File steht)
aufrufen.
In Java kann ich das machen über getClass().getMethod(...). Wie kann
ich das in C++ realisieren.



Mir fàllt dazu nur Handarbeit ein. Objekte instanziieren ist eigentlich
gar nicht so schwer, nennt sich "Factory" und geht dann eben in
Abhàngigkeit von string. Deine Objekte brauchen aber eine gemeinsame
Basisklasse - obj_basis.

typedef std::map< string, obj_basis* , std::less< string > > td_map_p_basis;

struct factory
{
td_map_p_basis m_pKlassen;

factory() {}

obj_basis* getClass(string Name)
{
if (!m_pKlassen[Name])
{ // Klasse muss einmalig angelegt werden,
// auch im Konstruktor für alle Klassen machbar
if (Name== "Klasse_1") m_pKlassen[Name]= new klass1();
else if (Name== "Klasse_2") m_pKlassen[Name]= new klass2();
else
}
return m_pKlassen[Name];
}

~factory()
{
for (td_map_p_basis::iterator it= m_pKlassen.begin(); it!=
m_pKlassen.end(); ++it) delete it->second;
}
};

Die Basisklasse muss dann natürlich eine virtuelle Methode
getMethod(...) haben, da wird das allerdings etwas schwieriger - das
einfachste wàre, an dieser Stelle ein Interface zu liefern, oder die
Methode direkt nach Name auszuführen. Was sollen das denn für Methoden
sein, mit denen Du was machen willst?

Ähnliche fragen