Über Datentypen interieren
-
@john-0 sagte in Über Datentypen interieren:
Naja, Du beschreibst das äußerst umständlich.
Wenn du meinst.
Das Problem scheint noch nicht verstanden zu sein. Aus dem Text Objekte zu bauen ist auch nicht das Problem.
Nochmals. Wir machen das etwas abstrakter.
Wir haben eine Liste.
EintragA
EintragB
EintragC
EintragD
EintragA
EintragB
EintragC
EintragDNun möchte ich aus der Liste 2 Einträge raus suchen und unterschiedlich behandeln
Also halte ich mir eine zweite Liste in der ich sage welche Einträge ich suchen möchte.Iteriere über beide Listen drüber und vergleiche und wenn ich den passenden Eintrag in der Liste gefunden habe muss ich etwas bestimmtes machen mit dem Eintrag.
So weit so gut. Die Idee war nun da die Einträge einem Datentypen entsprechen, also dessen Namen, ich keine Liste mit Namen speichere sondern eine Liste mit Datentypen.
Die Behandlung der beiden unterschiedlichen Einträge wäre dann durch Polymorphie oder Templateprogrammierung möglich.
Immer noch unverständlich. Wenn ja. Dann ists halt so. Sorry.
-
Du beschreibst dein Problem nicht präzise. Du sagst, dass du
- über Datentypen iterieren möchtest. Möchtest du aber nicht, du möchtest eine Fallunterscheidung für strings. Das, was du als Datentyp bezeichnest, ist letztendlich doch nur eine Eigenschaft eines JSON Objekts.
- eine Liste hast. Hast du aber nicht, du hast ein JSON Dokument, in dem bestimmte Objekte einen Namen haben.
Wenn du uns jetzt verrätst, was du konkret mit zwei Einträgen machen möchtest kann man dir vielleicht helfen.
-
ok ich bekomme es nicht rüber. Bzw @Schlangenmensch hat mich verstanden
Ich machs mit der Loockup Tabelle das wird das einfachste sein.
@DocShoe sagte in Über Datentypen interieren:
Wenn du uns jetzt verrätst, was du konkret mit zwei Einträgen machen möchtest kann man dir vielleicht helfen.
Was ich mit den Einträgen machen will ist doch völlig egal. Es geht mir doch nur darum dass ich die beiden Fälle unterscheiden kann. Egal ich lass es. Passt danke.
-
Ne, eben nicht. Du beschreibst deine Anforderung so konfus, dass niemand versteht, was du eigentlich machen möchtest. Du bist gedanklich ein paar Schritte weiter und beschreibst das Problem, das du nach diesen Schritten hast. Wenn du uns erklärst was du eigentlich vorhast kann man dir helfen. Für mich hört sich das jedenfalls nach dem XY Problem an.
Im Moment verstehe ich das so, dass du verschiedene JSON Objekte aus dem Dokument heraussuchen und unterschiedlich behandeln möchtest. Zur Fallunterscheidung dient dazu eine Eigenschaft des JSON Objekts, das du als "Datentyp" bezeichnest.
-
@DocShoe sagte in Über Datentypen interieren:
Ne, eben nicht. Du beschreibst deine Anforderung so konfus, dass niemand versteht, was du eigentlich machen möchtest.
Gut dann tuts mir leid dass ich das nicht so beschreiben kann dass du das verstehst. Oder es allgemein zu konfus ist. Wie auch immer
@DocShoe sagte in Über Datentypen interieren:
Zur Fallunterscheidung dient dazu eine Eigenschaft des JSON Objekts, das du als "Datentyp" bezeichnest.
Nein tut es nicht.
-
@booster sagte in Über Datentypen interieren:
Wenn du meinst.
Definitiv!
Wir haben eine Liste.
Was für eine Liste? (Wenn man sich den kompletten Thread durchliest, kann man entnehmen, dass es wohl Namen von Klassen in der Liste sind.) Warum steht das bei der Beschreibung nicht dabei? Du redest von Iterieren über Typen, meinst aber Namen von Typen. Das ist eben kein unwesentlicher Unterschied.
EintragA
EintragB
EintragC
EintragD
EintragA
EintragB
EintragC
EintragDNun möchte ich aus der Liste 2 Einträge raus suchen und unterschiedlich behandeln
Reflection Problem, Factory nehmen, die liefert dann für jeden Namen ein Objekt (Functor o.ä.) zurück, was dann irgend was macht, was Du vorher definiert hast.
-
@john-0 sagte in Über Datentypen interieren:
ja nochmals. Ihr könnt mich nun auch aufs übelste verurteilen dass ich das nicht so beschreiben kann das ihr euch das vorstellen könnt. Wollt ihr da nun weiter drauf rum hacken.
@john-0 sagte in Über Datentypen interieren:
Warum steht das bei der Beschreibung nicht dabei?
Tut es sogar an mehreren Stellen.
Hier zum Beispiel
@booster sagte in Über Datentypen interieren:
Noch ein Versuch... In der Json stehen die Namen der Typen der Klasse als vollständiger Name drin.
Vereinfacht
class mynamspace::classA
class mynamspace::classB
class mynamspace::classC
class mynamspace::classD
class mynamspace::classEAber egal.
Ich möchte das Objekt aus der Json nicht wieder deserialisieren. Ich möchte nur wissen ob sich die beiden Einträge in der Json befinden nichts weiter.
Wenn sich der Eintrag class mynamspace::classB im Json befindet dann führe Funktion X aus
Wenn sich der Eintrag class mynamspace::classD im Json befindet dann führe Funktion Y aus
-
@booster sagte in Über Datentypen interieren:
Wollt ihr da nun weiter drauf rum hacken.
Es geht darum, dass Du es einmal schaffst eine vollständige korrekte Beschreibung Deines Problems nieder zuschreiben, und das auch nicht auf einem Thread verteilt, sondern an einem Punkt.
Ich möchte das Objekt aus der Json nicht wieder deserialisieren. Ich möchte nur wissen ob sich die beiden Einträge in der Json befinden nichts weiter.
Es ist nichtsdestoweniger das Deserialierungsproblem, weil man aus einem Namen ein Objekt bauen muss. Ob man nun das komplette Objekt deserialisiert oder das nur für ein Hilfsobjekt macht, ist für die Lösung keinen wesentlichen Unterschied. Man kann das über eine std::map<std::string, YourSpecialFunctorAbstractClass> machen oder …
YourMapOfFunctions["mynamespace::classB"].foo();
Und daran denken, dass gcc (so auch andere Compiler) nicht den Namen aus dem Sourcecode über type_info.name() zurückliefern, sondern man diesen vorher erst demangeln muss.
-
@john-0 sagte in Über Datentypen interieren:
Es geht darum, dass Du es einmal schaffst eine vollständige korrekte Beschreibung Deines Problems nieder zuschreiben, und das auch nicht auf einem Thread verteilt, sondern an einem Punkt.
Ja sorry. Ich habe es oben beschrieben. Und dann habe ich auf Nachfrage versucht das anders zu beschreiben.
@john-0 sagte in Über Datentypen interieren:
Man kann das über eine std::map<std::string, YourSpecialFunctorAbstractClass> machen oder …
Ja das ist ja das was auch @Schlangenmensch vorgeschlagen hat. Die LoockupTabelle. Das hatte ich ja gesagt dass dieso wohl meine Lösung wird.....
-
@booster
Du kannst auch das JSON einlesen und daraus eine passende Datenstruktur aufbauen. Wenn du wissen willst welche Klassennamen im JSON vorkommen kannst du z.B. einfach einset<string>
mit allen Klassennamen befüllen. Und wenn du das erstmal hast, dann kannst du es einfach so schreiben:if (classNameSet.count("foo")) doTheFoo(); if (classNameSet.count("bar")) doTheBar();
-
Ok sorry aber genau darum ging es mir doch dass ich nachher kein switch case bzw if construct habe.
Also wir bleiben dabei. Die Lösung mit der Lookuptabelle scheint die richtige Wahl zu sein.
-
Ich versuche mal, dein Problem zu Beschreiben, wie ich es jetzt verstanden habe. Etwas vereinfacht.
Du hast eine Datei, in der stehen Instruktionen, die ausgeführt werden.
doThing1 doThing2 doThing3 ...
Der genaue Aufbau wird vermutlich flexibel sein. In deinem Fall hattest du jetzt Namen von Typen (Klassen) dort drin stehen, die am Ende aber für eine spezifische gewünschte Funktionalität stehen sollen.
Du hast jetzt alle / spezifische Einträge ausgelesen und willst diese ausführen. Das stellst du dir quasi so vor:
for action in json.getAllMyActions(): eval(action)
Also die Idee: C++ ist in der Lage action direkt zu interpretieren.
Du schafft es aber nur sowas hier umzusetzen:
for action in json.getAllMyActions(): if action == "doThing1": doThing1() elif action == "doThing2": doThing2() ...
Daher deine Aktion wird nicht direkt intepretiert, sondern du brauchst eine Fallunterscheidung. Diese Fallunterscheidung kann per if / else, switch / case oder auch per Map erfolgen. Aber du hast immer diese Redundanz sage ich mal
Ich habe es im Pseudocode schon angedeutet, in anderen Sprachen gibt es u.a.
eval
, welches in der Lage ist beliebigen Code als String auszuführen. Also unter anderem auch Methoden aufzurufen. Oder Objekte zu erzeugen etc.Das gibt es in C++ nicht. C++ hat einige Konstrukte angefangen mit Polymorphie oder auch templates (wie deine Idee war) mit der man so Fallunterscheidungen wie gewünscht hinbekommt ohne sie explizit aufzuschreiben. Die funktionieren aber alle nicht mit Strings. Und letzendes ist alles was aus deiner json datei rauskommt erst einmal Text.
In C++ hast du nach meinem Kenntnisstand also aktuell nur die Möglichkeit der Fallunterscheidung. Diese kannst du natürlich versuchen an andere Stellen des Codes zu schieben. Z.B. kannst du verschiedene json texte in unterschiedliche Objekte umwandeln und dann Polymorphie.
Dann hast du halt die Fallunterscheidung beim parsing.Aber ganz ohne wird es aktuell nicht. Reflection in C++ Version X in der Zukunft könnte das möglicherweise ändern. Aber so sieht der Stand heute aus.
-
@booster sagte in Über Datentypen interieren:
Ok sorry aber genau darum ging es mir doch dass ich nachher kein switch case bzw if construct habe.
Naja, mein
if
Konstrukt ist schon grundlegend anders als das if/switch Konstrukt das du beschrieben hast.
Es ist quasi equivalent zum Befüllen der Map die du mit deiner Variante brauchst.Aber hey. Wenn du deinen usecase und was du erreichen willst nicht besser beschreiben kannst... mir isses ziemlich egal wie du das jetzt löst.
-
Ist ja gut dass ihr meinen usecase nicht verstanden habt habe ich nun wiederum verstanden.
Trotzdem danke dass ihr euch trotzdem so bemüht habt bei der Suche nach einer Lösung.Und nochmals das mit dem Lookuptabelle finde ich doch nun akzeptabel.
Also gut jetzt. Danke nochmals an alle.
-
Es geht nicht darum, dich zu bashen oder sonstwie zu kritisieren, aber du musst lernen, deine Problem konkret beschreiben zu können. Das wird mit Sicherheit nicht das letzte Mal gewesen sein, dass du jemanden um Hilfe fragst.
-
@DocShoe Jep, ich hab gelernt das ich meine Fragen im überwiegenden Fall selbst beantworten kann, wenn ich mein Problem korrekt beschreiben kann.
-
@daMicha sagte in Über Datentypen interieren:
@DocShoe Jep, ich hab gelernt das ich meine Fragen im überwiegenden Fall selbst beantworten kann, wenn ich mein Problem korrekt beschreiben kann.
+1. Man möchte meinen, ich stelle hier im Forum selten Fragen. Aber die Wahrheit ist, dass ich öfters Fragen anfange, aber mir dann solche Mühe gebe, alle Gegenfragen und Eventualitäten im Voraus zu beantworten, dass sich das Problem ganz von alleine löst.
Das hat sogar einen Namen: Quitescheentchenmethode. Das ist meiner Erfahrung nach die mit Abstand beste Methode, um Fehler zu lösen. Es braucht natürlich eine gewisse Erfahrung und es ist gerade am Anfang hilfreich, wenn das Quietscheentchen ein echter erfahrener Programmierer ist, der dann auch leitende Gegenfragen stellt. Gerade das versuchen wir ja gerade in diesem Thread, aber leider springt booster nicht so recht darauf an.
PS: Mein aus Erfahrung gewonnener wichtigster Tipp bei der Methode ist, dass ein Computer immer eine 100% deterministische Maschine ist. "Gremlins" wird zwar gern von verzweifelten Leuten als Erklärung heran gezogen (habe ich auch schon oft gemacht), aber es ist nie die Erklärung. Wenn die Beobachtungen nicht zu den Annahmen passen, dann müssen eben die Annahmen hinterfragt werden. (Beispiel Gremlins: Wenn die Maschine nicht-deterministisch erscheint, gibt es eine versteckte Variable, die man fälschlicherweise vernachlässigt hat)
Der letzte Absatz hilft booster nicht weiter, aber das musste ich noch los werden. boosters Schwierigkeit ist, das Problem überhaupt sauber zu formulieren.
-
@booster sagte in Über Datentypen interieren:
Ja sorry. Ich habe es oben beschrieben. Und dann habe ich auf Nachfrage versucht das anders zu beschreiben.
Man kann hier im Forum die Beiträge editieren, so auch der Anfangsbeitrag mit der Problembeschreibung. Das macht es dann leichter die zu helfen.
Ja das ist ja das was auch @Schlangenmensch vorgeschlagen hat. Die LoockupTabelle. Das hatte ich ja gesagt dass dieso wohl meine Lösung wird.....
Man kann noch eine Factory darum bauen, und die Klassen sich selbst im Startup registrieren lassen etc.