Frage zu enum



  • Ich habe in Delphi diesen Code und möchte diesen in den C++Builder übertragen.

    const
      CServerReplies: array [TServerReply] of string = (
        { srNone            } 'Timed out (no reply)',
        { srInvalidFrame    } 'Timed out (reply frame is corrupted)',
        { srUnexpectedReply } 'Timed out (reply from unexpected server)',
        { srUnmatchedReply  } 'Failed (reply does not match request)',
        { srExceptionReply  } 'Failed (server returned exception reply)',
        { srNormalReply     } 'Transaction succeeded'
      );
    

    Ich komme mit dem enum TServerReply aber nicht ganz klar

    enum TServerReply { srNone, srInvalidFrame, srUnexpectedReply, srUnmatchedReply, srExceptionReply, srNormalReply };
    

    Wie kann ich das hier einbinden?

    const UnicodeString CServerReplies[] =
    {
        /* srNone            */ "Timed out (no reply)",
        /* srInvalidFrame    */ "Timed out (reply frame is corrupted)",
        /* srUnexpectedReply */ "Timed out (reply from unexpected server)",
        /* srUnmatchedReply  */ "Failed (reply does not match request)",
        /* srExceptionReply  */ "Failed (server returned exception reply)",
        /* srNormalReply     */ "Transaction succeeded"
    };
    


  • Inwiefern "einbinden"!?



  • Hallo

    Soetwas geht in C++ nicht direkt. Du hast zwei Möglichkeiten :

    Wenn dein enum so deklariert bleibt du hier zeigst, dann kannst du darauf bauen das die Elemente des enums mit 0 beginnend durchnummeriert werden. Dann kannst du einfach ein normales Array aus Strings bauen und die implizit zu Integer konvertierten enum-Elemente als Index verwenden

    enum TServerReply { srNone, srInvalidFrame, srUnexpectedReply, srUnmatchedReply, srExceptionReply, srNormalReply };
    const UnicodeString CServerReplies[] =
    {
        /* srNone            */ "Timed out (no reply)",
        /* srInvalidFrame    */ "Timed out (reply frame is corrupted)",
        /* srUnexpectedReply */ "Timed out (reply from unexpected server)",
        /* srUnmatchedReply  */ "Failed (reply does not match request)",
        /* srExceptionReply  */ "Failed (server returned exception reply)",
        /* srNormalReply     */ "Transaction succeeded"
    };
    
    // Verwendung :
    UnicodeString test = CServerReplies[srNone];
    

    Wenn du aber nicht davon ausgehen kannst, das die Elemente ab 0 durchnummeriert sind, kannst du nicht einfach ein C-Array verwenden. Am einfachsten ist dann die verwendung von std::map, mit dem du enums und Strings verbindest.

    // Keine Standard-Nummeriung der Elemente!
    enum TServerReply { srNone = 10, srInvalidFrame, srUnexpectedReply, srUnmatchedReply = 20, srExceptionReply, srNormalReply };
    
    #include <map>
    std::map<TServerReply, UnicodeString> CServerReplies;
    
    // Einmal füllen
    CServerReplies.insert(std::make_pair(srNone, "Timed out (no reply)"));
    // ...
    
    // Verwenden
    std::map<TServerReply, UnicodeString>::const_iterator it = CServerReplies.find(srNone);
    if (it != CServerReplies.end())
    {
      UnicodeString test = it->second; // Gefunden
    }
    else
    {
      // Nicht gefunden
    }
    

    bis bald
    akari



  • Bezüglich deiner Frage hat akari bereits die richtige Antwort gegeben. Darf ich noch die obligatorische Frage stellen, warum du den Delphi-Code übersetzen und nicht einfach so einbinden willst?



  • Danke akari für die tolle Lösung.

    @audacia
    Inwiefern einfach so einbinden? Ich kann doch Delphi Code nicht in meinen C++ Code reinsetzen. Verstehe ich jetzt nicht ^^°



  • Enumianer schrieb:

    @audacia
    Inwiefern einfach so einbinden? Ich kann doch Delphi Code nicht in meinen C++ Code reinsetzen.

    Dachte ich's mir doch 😉

    Freilich kannst du. Einfach dein Delphi-Unit zum Projekt hinzufügen. Dann generiert der Compiler eine Headerdatei dafür (MyDelphiUnit.pas -> MyDelphiUnit.hpp), die du in C++-Code einbinden und benutzen kannst.


Anmelden zum Antworten