Definiert als string -> returned als char?
-
Ja, weiß ich sicherlich, aber wenn ich den Datentypen als std::string definiert habe und ihn auch vermeindlich auch werfe, dann muss ich den doch auch als std::string irgendwie fangen können?
Oder gibts noch ne Implementation von String die das besser verstecken kann
?
-
Seikilos schrieb:
Oder gibts noch ne Implementation von String die das besser verstecken kann
?Das hat nichts mit irgendeiner Implementation zu tun. Der Typ von "Fehler" ist nun mal char*, und das musst du dann auch fangen.
-
String-Literale sind in C++ immer noch char* - d.h. einen
throw "Fehler";mußt du mitcatch(char* s)...auffangen (da greifen nicht die üblichen impliziten Umwandlungen).PS: Dir ist der Unterschied zwischen "normalem" return und Exceptions schon klar?
-
Hehe, klar weiß ich was Exceptions und was returns sind.
Ich bin nur sehr erstaunt, dass es einen char* Wrapper namens String gibt, der aber dort, wo ich es logisch gefunden hätte nicht greift...
Also muss ich den nochmal in einen String danach packen, naja...
-
Wenn du einen std::string wirfst dann kannst du ihn natürlich auch als solchen fangen. Nur ist ein Stringliteral kein std::string sondern eher ein const char* (genauer ein Array von n const char). Wenn ein L davorsteht natürlich die wchar_t Variante.
[edit] Das war ja viel zu spät. [edit]
-
Achso, also erstmal vor throw ein string s = "text";
definieren, dann werfen?
-
Seikilos schrieb:
Achso, also erstmal vor throw ein string s = "text";
definieren, dann werfen?(D)Evil hat's dir doch gezeigt.
-
Seikilos schrieb:
...char* Wrapper namens String ...

-
So wie (D)Evil es geschrieben hat reicht es auch.
-
Ah! Entschuldigung, hatte den Zusammenhang da noch nicht gehabt, jetzt ists mir klar, danke (D)evil!

Eine anonyme Variable ist ja sowas in der Art.
Danke an alle, ps die Ironie von Simon2 versteh ich nicht
-
-
Goldwaage?

Ich hab in dem Zusammenhang nicht explizit von nem Entwurfsmuster gesprochen, sondern von der Tatsache, dass für mich String ein Wrapper für char* ist, er verpackt in den in eine neue Hülle, das tut er doch? Damit man besser mit char sequenzen arbeiten kann
-
Der Typ eines Stringliterals ist Array aus const char (bzw. wchar_t). Wenn der Operand eines throw-Ausdrucks ein Array aus T ist, so ist das Exceptionobjekt, das geworfen wird, vom Typ Zeiger auf T.
throw "Fehler"
wirft also eine Exception vom Typ const char* .Als Handler kommen damit in Frage:
catch (const char*) catch (const char*&) catch (const char* const&) catch (const char* volatile&) catch (const char* const volatile&) catch (const volatile char*) catch (const volatile char* const&) catch (const volatile char* const volatile&) catch (...)Alles Andere ist nicht standardkonform.
-
Seikilos schrieb:
Goldwaage?

Ich hab in dem Zusammenhang nicht explizit von nem Entwurfsmuster gesprochen, sondern von der Tatsache, dass für mich String ein Wrapper für char* ist, er verpackt in den in eine neue Hülle, das tut er doch? Damit man besser mit char sequenzen arbeiten kannNaja, ich sehe std::string schon als eigene Klasse, die die Arbeiten übernimmt, die man früher mit char*, strxy(), ... erledigt hat.
Es ist ja nicht einmal notwendig, dass string die Daten in Form eines "char*" ablegt. Das kann der prinzipiell auch ganz anders machen....Sagen wir mal andersherum: "String" ist eigentlich das zugrundeliegende Konzept, das man in C leider nicht anders als mit NTBS-char* abbilden konnte...und std::string kommt dem eigentlichen Konzept schon sehr viel näher.
Oder wer interessiert sich wirklich für einen "Zeiger auf eine Einbytezahl", wenn er Text bearbeiten will ?
Gruß,
Simon2.