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.