600 Freunde...

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

600 Freunde...

Beitrag von Xin » Do Mai 15, 2014 5:03 pm

Ich stelle jetzt auch mal eine Frage, weil ich noch keine gefällige Lösung habe.

Das Problem:
Ich habe rund 600 Klassen, die alle einen statischen Member haben, der den Namen der Klasse enthält:

Code: Alles auswählen

class OberKlasse
{
  static char const * MeinKlassenname;

  char const * NameDerKlasseDieserInstanz;
};

class TolleKlasse : public Oberklasse
{
  static char const * MeinKlassenname;
};
Nun möchte ich Objekte fragen können, ob sie der Klasse "blabla" zugehörig sind. 'TolleKlasse' würde also isof( "TolleKlasse" ) true antworten, aber auch bei isof( "Oberklasse" ).

Dafür müsste ich einen Stringvergleich machen, das dauert mir zu lange. Nun hat jede Klasse ihren Namen ja statisch vorliegen und übermittelt diesen in den Konstruktor von 'Oberklasse'. Es würde also vollkommen reichen, mit dem Pointer der statischen Instanz zu vergleichen. Das Blöde dabei ist, dass ich eine Liste bekomme, in der die Strings ausgewählter Klassen stecken. Ich muss also sicherstellen, dass derjenige, der die Liste füttert, auch die statischen Klassennamen verwendet (also TolleKlasse::MeinKlassenname) und nicht einfach "TolleKlasse" schreibt.

Ich möchte also eine Klasse "Klassenname" einführen und dort den Konstruktor für (char const *) öffentlich verbieten. Nun habe ich nur das Problem, dass ich für meine Klasse "Klassenname" rund 600 'friend class ...;' angeben müsste, damit diese auf den Konstruktor zugreifen können, um ihren jeweiligen statischen Klassennamen zu erzeugen.

Die Frage ist nun, wie man "Klassenname" öffentlich zugänglich macht, so dass es nur diese 600 statischen Instanzen gibt, aber auf keinen Fall andere, ohne mir einen Wolf an friend-classes zu schreiben?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: 600 Freunde...

Beitrag von oenone » Fr Mai 16, 2014 1:32 pm

Hört sich nach Reflection an. Guck dir mal RTTI an:
http://www.proggen.org/doku.php?id=cpp:oop:rtti

Ansonsten kannst du auch einen dynamic_cast in die vermutete Superklasse versuchen:
http://www.proggen.org/doku.php?id=cpp:cast:dynamic

Einen String brauchst du im Grunde nicht. Den (ungefähren) Namen kannst du bei Bedarf auch über RTTI bekommen, wie hier beschrieben:
http://www.proggen.org/doku.php?id=cpp: ... s_ausgeben

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: 600 Freunde...

Beitrag von Xin » Fr Mai 16, 2014 2:15 pm

oenone hat geschrieben:Hört sich nach Reflection an. Guck dir mal RTTI an:
http://www.proggen.org/doku.php?id=cpp:oop:rtti
In gewisser Weise geht es in die Richtung Reflection...
oenone hat geschrieben:Ansonsten kannst du auch einen dynamic_cast in die vermutete Superklasse versuchen:
http://www.proggen.org/doku.php?id=cpp:cast:dynamic
Auch wenn es dynamic_cast heißt - es wird statisch ausgeführt. ^^

Ich bekomme eine dynamische Liste von Strings und ich kann einen String nicht als Ziel eines dynamic_cast angeben.
oenone hat geschrieben:Einen String brauchst du im Grunde nicht. Den (ungefähren) Namen kannst du bei Bedarf auch über RTTI bekommen, wie hier beschrieben:
http://www.proggen.org/doku.php?id=cpp: ... s_ausgeben
Ich brauche den String, weil ich ihn zum Vergleich angeboten bekomme - eben in der String-List. Grundsätzlich könnte ich den Namen des Strings wohl aus der RTTI-Information basteln, aber da ich den String auch benötige, um eine solche Klasse in eine Text-Datei zu überführen, möchte ich da nichts basteln, sondern den Namen als String weiterhin verfügbar halten. Der String entspricht daher nicht 1:1 dem Klassennamen (für die Klasse "TolleKlasse" wäre der String zum Beispiel "TOLLEKLASSE").

RTTI ist hier leider keine Lösung. Aber danke für die guten Links, ich von dem Autor habe ich schonmal was gelesen.. :-D

Die OberKlasse-Klasse brauche ich zur Identifikation und um eben diesen String auszuspucken. Und damit ich keine aufwendigen Stringvergleiche machen muss, brauche ich weiterhin eine Wrapper-Klasse, die man nicht an beliebiger Stelle erstellen darf.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten