Über Datentypen interieren



  • @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 ein set<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();
    


  • @hustbaer

    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:

    @hustbaer

    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.



  • @hustbaer

    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.


  • Mod

    @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.


Anmelden zum Antworten