Definiert als string -> returned als char?



  • 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 mit catch(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


  • Mod

    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 kann

    Naja, 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.


Anmelden zum Antworten