wie caste ich richtig



  • Danke für die reichlichen antworten die Seite werd ich jetzt sofort downloaden und sichern.



  • Also nur zur Info man kann nicht jeden beliebigen Datentyp in einen anderen umwandeln?



  • Kevinus schrieb:

    Also nur zur Info man kann nicht jeden beliebigen Datentyp in einen anderen umwandeln?

    Das geht schon, nur ob es Sinn macht ist was anderes.

    template<class TypeTarget, class TypeSource>
    TypeTarget const& force_cast(TypeSource const& src)
    {
        return *reinterpret_cast<TypeTarget const*>(&src);
    }
    

    Gruß



  • ok daraus werde ich nicht richtig schlau, wie sehe es aus wenn ich einen int wert in einen string umwandeln möchte?

    oder einen int Wert in einen char *?

    Der Compiler sagt mir bei static_cast das das nicht zulässig wäre diese Datentypen ineinander umzuwandeln.



  • Da musst du static_cast dafür nehmen, da die neuen Casts genaue Aufgabengebiete haben und keiner mehr alles kann.

    Nen force_cast muss man daher so schreiben:

    template< typename T, typename S > T force_cast( const S& source )
    {
      return (T)source;
    }
    // Anwendung:
    // int i = force_cast< int >( "Hallo" );
    


  • aha aber das löst nicht das Problem wenn ich schreibe

    ...
    int I;
    string Test=static_cast<string>(I);
    ...
    

    sagt der Compiler das wäre nicht zulässig! Wie löse ich dieses Problem?



  • In die FAQ schauen 👍

    Gruß



  • Du kansst keinen int in einen string casten.
    Umwandeln ist gefragt ( siehe sprintf, stringstreams ).
    Kurt



  • oder boost::lexical_cast



  • und gehen diese Methoden auch für cast * Werte=? Wie sieht es da mit Befehlen aus?



  • eigentlich müßte man unterscheiden zwischen casten und konvertieren.

    beim konvertieren werden daten von einem datentyp in einen anderen umgewandelt. zB in int in eine zeichenkette.

    beim casten bleiben die daten im speicher unverändert. der compiler wird lediglich angewiesen, sie anders zu interpretieren. zB kann man einen zeiger auf eine beliebige datenstruktur in einen zeiger auf char casten und dann die chars in eine datei schreiben.

    leider wird in c/c++ begrifflich nicht zwischen casten und konvertieren unterschieden, was für anfänger verwirrend sein kann. da wird dann schon mal versucht einen string zu einem int zu "casten": (int)"1234" 🤡

    in c/c++ ist die konversion zwischen einfachen datentypen eingebaut. ein cast zwischen einfachen datentypen führt dann tatsächlich zu einer konversion. zB int x=(int)3.14 (weiter weiß ich pi auch nicht :D). bei zeigern wird uminterpretiert und ein cast zwischen verschiedenen structs/klassen ist auf direktem wege garnicht möglich. man kann aber structs/klassen casten indem man den zeiger auf die struktur nimmt und ihn auf einen zeiger auf eine andere struktur castet.

    fazit: ist in c/c++ halt alles ein bißchen kompliziert.



  • Kevinus schrieb:

    aha aber das löst nicht das Problem wenn ich schreibe

    ...
    int I;
    string Test=static_cast<string>(I);
    ...
    

    sagt der Compiler das wäre nicht zulässig! Wie löse ich dieses Problem?

    die stl-strings bietet mW keine funktion, um ints in einen string zu konvertieren 😞 in c++ nimmt man dafür am besten stringstreams.



  • gut das habsch kapiert ich suche jetzt gerade Funktionen wie ich int Werte in einen char *Zeiger schreiben kann.



  • wenn du einen c-string haben willst, dann mußt du dich mit dem guten alten ansi-c-sprintf behelfen:

    #include<cstdio>
    
    int  x=67276;
    char text[256];
    sprintf(text,"%d",x);
    


  • joar danke für die Hilfe ich habe meine Funktion aber auf string aufgebaut weil es mir dort wesentlich leichter geht das zu verwirklichen was ich brauche.



  • Konfusius schrieb:

    eigentlich müßte man unterscheiden zwischen casten und konvertieren.

    Richtig.

    beim konvertieren werden daten von einem datentyp in einen anderen umgewandelt. zB in int in eine zeichenkette.
    beim casten bleiben die daten im speicher unverändert.

    Das ist quatsch.

    Ein cast ist immer eine explizite Typkonvertierung. Was genau dort geschieht, ist abhängig von den konkreten Typen und dem verwendeten cast-Ausdruck. Eine reine Reinterpretierung des Bitmusters macht in der Regel nur der reinterpret_cast.



  • Konfusius schrieb:

    wenn du einen c-string haben willst, dann mußt du dich mit dem guten alten ansi-c-sprintf behelfen:

    #include<cstdio>
    
    int  x=67276;
    char text[256];
    sprintf(text,"%d",x);
    
    stringstream stream;
    stream<<x;
    stream.str().c_str();
    


  • HumeSikkins schrieb:

    Konfusius schrieb:

    eigentlich müßte man unterscheiden zwischen casten und konvertieren.

    Richtig.

    beim konvertieren werden daten von einem datentyp in einen anderen umgewandelt. zB in int in eine zeichenkette.
    beim casten bleiben die daten im speicher unverändert.

    Das ist quatsch.

    Ein cast ist immer eine explizite Typkonvertierung. Was genau dort geschieht, ist abhängig von den konkreten Typen und dem verwendeten cast-Ausdruck. Eine reine Reinterpretierung des Bitmusters macht in der Regel nur der reinterpret_cast.

    habe mich vielleicht mißverständlich ausgedrückt. als ich geschrieben hatte

    beim casten bleiben die daten im speicher unverändert.

    meinte ich "casten" im sinne einer präzisen begriffsdefinition. in sinne von c/c++ kann casten natürlich auch konvertieren bedeuten.



  • Konfusius schrieb:

    meinte ich "casten" im sinne einer präzisen begriffsdefinition. in sinne von c/c++ kann casten natürlich auch konvertieren bedeuten.

    Wovon redest du? Die C++ Bedeutung von cast ist die selbe wie in anderen Programmiersprachen auch.
    Ich habe das immer so gelernt: Bei Programmiersprachen unterscheidet man zwischen coercions und cast. coercions sind implizite Typkonvertierungen die durchgeführt werden um gewisse Operations-Interfaces zu erfüllen.
    cats sind hingegen explizite Typkonvertierungen die vom Programmierer durchgeführt werden.
    Ob bei coercions und/oder casts Informationen verloren gehen können, bzw. Typen einfach nur uminterpretiert werden ist abhängig von der Programmiersprache. Das sind beides keine erforderlichen Eigenschaften.



  • ich meine "casten" im sinne von uminterpretieren und "konvertieren" im sinne von umwandeln.

    ich habe in meinem beitrag nur versucht zu erklären, was unter umiterpretieren im gegensatz zu umwandeln zu verstehen ist. das ich "casten" anstelle von "uminterpretieren" geschrieben habe war vielleicht mißverständlich.


Anmelden zum Antworten