Klassen verwenden ohne zu Wissen wie sie heißen?

Fragen zum Thema HTML, JavaScript, PHP
Antworten
canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Klassen verwenden ohne zu Wissen wie sie heißen?

Beitrag von canlot » Do Dez 13, 2012 12:57 pm

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

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Klassen verwenden ohne zu Wissen wie sie heißen?

Beitrag von Kerli » Do Dez 13, 2012 1:44 pm

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

Benutzeravatar
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?

Beitrag von deung » Do Dez 13, 2012 9:09 pm

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.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3123
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Klassen verwenden ohne zu Wissen wie sie heißen?

Beitrag von cloidnerux » Do Dez 13, 2012 9:48 pm

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.
C++ ist für die Verwendung im Webbereich zu kompliziert, wenn man nix großes programmieren will. Damit fällt dieses Konzept leider aus.

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

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Klassen verwenden ohne zu Wissen wie sie heißen?

Beitrag von canlot » Do Dez 13, 2012 11:06 pm

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 :D 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

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: Klassen verwenden ohne zu Wissen wie sie heißen?

Beitrag von Kerli » Fr Dez 14, 2012 12:05 am

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

Antworten