Klassen verwenden ohne zu Wissen wie sie heißen?
Klassen verwenden ohne zu Wissen wie sie heißen?
Hallo ich melde mich wieder nach langer Zeit. Ich programmiere ein eigenes CMS System. Ich bin schon etwas weiter und ich bin jetzt dabei die Module dafür zu programmieren. Die Module sollen so wie in anderen großen Projekten seine Daten aus der Datenbank ziehen und dann über die Klasse "window" bzw. "dokument" auf der Seite ausgrgeben werden. Ich will auch einen Installations Manager programmieren und der soll dann verschiedene Module einbinden. Aber wie soll ich den Namen der Klasse rausfinden die installiert worden ist? Ich muss auf sie zugreifen können. Ich kann natürlich auch die Datei auslesen und den Namen rauskriegen. Ich meine aber dass es anders geht und ich vielleicht über die Elternklasse zugreifen kann. In C++ muss das auch irgentwie gehen weil man da keine offene textdatei hat.
Unwissenheit ist ein Segen
Re: Klassen verwenden ohne zu Wissen wie sie heißen?
Je nach verwendeter Sprache funktioniert das teils sehr unterschiedlich. In PHP zb kann man eine Klasseninstanz aus dem Inhalt einer Stringvariablen mit dem Klassennamen erstellen. In C++ ist das nicht möglich, da C++ im Gegensatz zu PHP eine kompilierende Sprache ist und daher zur Kompilierzeit wissen muss welcher Typ eine Klasse/Variable haben wird. Man kann allerdings eine Factory erstellen die anschließend die gewünschte Klasseninstanz aus einem String erzeugt. Also zb. eine std::map<std::string, std::function> oä.
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
- deung
- Beiträge: 21
- Registriert: So Dez 09, 2012 2:59 pm
- Wohnort: Hinter dien 7 Bergen bei den 7 Zwergen
Re: Klassen verwenden ohne zu Wissen wie sie heißen?
Du könntest aber auch versuchen Module zu erstellen und diese dynamisch laden.
Quasi als *.dll. Wie das genau unter C++ geht weiß ich leider auch nicht, aber einen Versuch ist es Wert.
Quasi als *.dll. Wie das genau unter C++ geht weiß ich leider auch nicht, aber einen Versuch ist es Wert.
- cloidnerux
- Moderator
- Beiträge: 3125
- Registriert: Fr Sep 26, 2008 4:37 pm
- Wohnort: Ram (Gibts wirklich)
Re: Klassen verwenden ohne zu Wissen wie sie heißen?
C++ ist für die Verwendung im Webbereich zu kompliziert, wenn man nix großes programmieren will. Damit fällt dieses Konzept leider aus.Du könntest aber auch versuchen Module zu erstellen und diese dynamisch laden.
Quasi als *.dll. Wie das genau unter C++ geht weiß ich leider auch nicht, aber einen Versuch ist es Wert.
Was man aber machen kann, ist eine API zu definieren. Nach dieser API forderst du, dass jedes Modul/Klasse eine bestimmte Funktion beinhalten muss.
Am besten wird das von einer Klasse abgeleitet.
Sinnvollerweise mehrere Funktionen, eine Info-Funktionen für Modulinfos, Interface zum Zeichnen, etc, was du halt brauchst.
Redundanz macht wiederholen unnötig.
quod erat expectandum
quod erat expectandum
Re: Klassen verwenden ohne zu Wissen wie sie heißen?
Ja so was meine ich in der Art. Also eine Elternklasse vielleicht und das ich über die auf die Kindklasse zugreife. Bloß da brauche ich immer noch den Namen der Klasse. Ich weiß das man in php noch anders lösen könnte bloß ist das alles nicht elegant genug
Kerli wie meinst du das mit Factory in C++ hab dazu gegoogelt habe aber nicht gescheites finden können. Hab da echt ein Brett vorm Kopf^^

Unwissenheit ist ein Segen
Re: Klassen verwenden ohne zu Wissen wie sie heißen?
Eine Factory ist nichts anderes als eine Funktion die ein Objekt erzeugt. Funktionen kann man auch leicht zb. aus einer dynamischen geladenen Bibliothek laden. Gemeint habe ich das in etwa wie folgt (nicht getestet):
Code: Alles auswählen
class PluginInterface
{
public:
virtual void doSomething() = 0;
}
typedef (PluginFactory*)(void*);
typedef std::map<std::string, PluginFactory> PluginFactories;
PluginFactories factories;
/* Irgendwo in deinem Programm */
class TollesPlugin:
public PluginInterface
{
virtual void doSomething()
{
std::cout << "TollesPlugin tut etwas..." << std::endl;
}
}
PluginInterface* tollesPluginFactory(void* param)
{
return new TollesPlugin;
}
factories["TollesPlugin"] = &tollesPluginFactory;
/* Du kannst auch neue Plugins aus einer Bibliothek laden in dem du dort
einfach eine Factory Funktion mit einem bestimmen Namen ladest und in
die Factory Map einfügst.
*/
/* An einer anderen Stelle werden dann die gewünschten Instanzen erzeugt: */
PluginInterface* my_plugin = 0;
void* param = 0; // Falls die Factory irgendwelche Daten braucht
PluginFactories::iterator factory = factories.find("TollesPlugin");
if( factory != factories.end() )
my_plugin = factory->second(param);
if( !my_plugin )
throw std::runtime_error("Failed to create instance of TollesPlugin");
my_plugin->doSomething();
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at
OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at