[C++]Dictionarys

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • [C++]Dictionarys

      Guten Abend ds.de.
      Ich habe in letzter Zeit ein wenig Python gescripted und gebastelt und habe da einen kleinen Kommandozeileninterpreter in Funktionsschreibweise zusammengeschustert.
      Jetzt wollte ich das mal auf C++ umbauen und recoden, um halt die Performance zu steigern und aus Interesse. Allerdings benutze ich in Python ein Dictionary um Variablen zu verwalten. Aber ich weiß nicht wie ich das Dictionary Konzept in C++ umsetzen soll.
      Also ich will in C++ ein Dateiformat basteln, das zu einem Key, der jeden Typ haben darf, also auch abstrakte Datentypen, ein Item liefert, das auch jeden Typ haben darf. Da ich das primär zum auslesen und zuordnen von Variablen in einer Skriptsprache benutzen würde, reichte es mir schon als Key nur Strings anzugeben, aber mir ist nicht klar wie man in C++ Dynamische Typen umsetzt. Ich hatte jetzt an ein Template gedacht, aber dann muss ich während der Laufzeit trotzdem irgendwie die Typen feststellen und einsetzen und daran scheitere ich noch. Kennt sich irgendwer damit aus und kann mal beschreiben wie man das macht?

      Danke,
      Cave_Man
      [17:57:06] <Cave_Man> wie mache ich buletten?
      [...]
      [17:58:35] <Warbringer> Der Höhlemensch auf kulinarischer Entdeckungsreise: "Wie mache ich Bouletten?"
    • Hallo,

      Kann selber kein C++, wollte aber aufgrund der geringen Anzahl von Antworten doch noch etwas hinzufügen.

      Für Ruby gibt es den Ruby Header, der es ermöglicht Ruby Erweiterungen in C zu schreiben. Dieser könnte für dich interessant sein, da er es ermöglicht in C (typisiert) Ruby (untypisiert) abzubilden.

      Hashes in C kann man doch über ein Zweidimensionales Array abbilden, in der ersten Spalte stehen eben der String in der zweiten Spalte die Items

      Tray

      Quellcode

      1. main()
      2. {
      3. for(;;)
      4. printf("DotaInside - ich war dabei!\n");
      5. }
    • Generell geht das was du vorhast in C++ nicht so einfach wie du dir das vorstellst :D.
      Ist im Vergleich zu Python da ne Menge schreibarbeit nötig.

      Der Datentyp den ich verwenden würde wäre Map aus der STL. Das ist eine Templateklasse die Key -> Value zuordnungen macht. Du hast damit aber immernoch das Problem das du die Map für eine bestimmten Key und Value Datentyp erzeugen must. Was ich damit meine ist du hast dann eine Map die zum Beispiel Strings auf Int Abbildung kann. Du kannst aber nun nichts anderes in diese Map speichern als solche Abbildungen (String auf Int). So wie ich dich verstanden habe willst du aber Strings auf IRGENDWAS. Das geht meines Wissens nach in C++ nur über einen Weg.
      Um dieses Problem zu umgehen bleibt dir nichts anderes übrig als für alle Datentypen die du als Value in die Map reinstecken willst eine Oberklasse zu bilden und die Datentypen davon erben zu lassen. Du instanziierst dann die Map als String -> *Oberklasse Abbildung. Nun kannst du alles als Value was von der Oberklasse erbt in die Map stecken. Damit du die Objekte auch wieder auf ihre wirklichen typen zurückcasten kannst (du hast ja dann nur Pointer auf die Oberklasse und mehrere Möglichkeiten was die WIRKLICHE Klasse sein könnte) solltest du noch eine Methode in die Oberklasse packen die dir den Typ der Klasse zurückliefert und diese Methode in jeder Unterklasse überschreiben.

      Beispiel (nicht getestet):

      C-Quellcode

      1. #include <string>
      2. #include <map>
      3. using namespace std;
      4. class Oberklasse {
      5. public:
      6. int getType() const = 0;
      7. };
      8. class Unterklasse1 {
      9. public:
      10. void bla() { /*does something */}
      11. int getType() const { return 1;}
      12. };
      13. class Unterklasse2 {
      14. public:
      15. int getType() const {return 2;}
      16. };
      17. int main() {
      18. map<string, *Oberklasse> meineMap;
      19. //Achtung speicherleck ich zertör die mit new in dem Beispiel nicht wieder mit delete!!
      20. meineMap.insert(pair<string, *Oberklasse>("erstes", new Unterklasse1()));
      21. meineMap.insert(pair<string, *Oberklasse>("zweites", new Unterklasse2()));
      22. //cast nötig da Oberklassen Pointer in map. Wenn wir nicht sicher sind können wir mit getType
      23. //checken welche Klasse wir wirklich haben (dynamische Bindung!).
      24. *Unterklasse1 k1 = dynamic_cast<*Unterklasse1>(meineMap["erstes"]);
      25. k1->bla();
      26. return 0;
      27. }
      Alles anzeigen


      Ich hoffe das war halbwegs verständlich ausgedrückt wie du sowas in C++ umsetzen könntest. Wie du siehst sind Maps in die man alles speichern kann nicht wirklich easy. Generell solltest du dir aber gedanken machen ob du deinen Code wirklich eins zu eins übersetzen willst. Meistens bietet es sich doch an den Code nochmal explizit für die Sprache auf die man portiert anzupassen um die Sprachstärken auszunutzen und nich umständlicher zu schreiben als es Nötig ist.

      Btw nur weil ich keinen einfacheren Weg kenne das gewünschte umzusetzen heißt das noch lange nicht das es diesen nicht gibt. C++ hat einen recht krassen Sprachumfang und vllt gibt es da auch eine Möglichkeit das ganze mit Templatefoo oder durch features des c++0x einfacher aszudrücken. Solche komplexeren Fragen sind mMn auch besser in einem C++ Forum aufgehoben :D

      Hab den Post leider erst jetzt gesehen sonst hätte ich schon wesentlich früher was dazu geschrieben (thx Tray).

      EDIT: Mir ist gerade eingefallen das ich doch glatt *void vergessen habe. In nen Void Pointer kannste auch alles reinstellen was du willst.

      MFG downtimes

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von downtimes ()

    • Benutzer online 1

      1 Besucher