Frage zum Speichern & Laden von Datein



  • Da könnt' sich doch mal jemand der Mod's erbarmen und einen FAQ Beitrag zu den verschiedenen Casts schreiben.

    Greetz, Swordfish



  • Z2 schrieb:

    ein static_cast entspricht einem einfachen C-Type-Cast:

    Mit einem C-Cast kann man z.B. ein const wegcasten.

    Ahja...und wie ?



  • so:

    #include <iostream>
    
    using namespace std;
    
    #ifdef STUPID_COMPILER
    
    void no_cast_away( const char *untouchable )
    {
        // Sollten nur dämliche Compiler - wenn überhaupt - zulassen
        // meiner: error C2166: L-Wert gibt ein konstantes Objekt an
    
        untouchable[ 1 ] = 'a';
    }
    
    #endif /* STUPID_COMPILER */
    
    void c_cast_away( const char *untouchable )
    {
        // Hups, const ist weg:
    
        ( (char*) untouchable )[ 1 ] = 'a';
    }
    
    void cpp_cast_away( const char *untouchable )
    {
        // mit C++ muss man sich wissentlich in's Knie schießen:    
    
        const_cast< char* >( untouchable )[ 1 ] = 'a';
    }
    
    int main( )
    {
        char *foo = new char[ 10 ];
        strcpy( foo, "Hello!" );
    
        cout << "original: " << foo << endl;
    
        c_cast_away( foo );
        cout << "after c_cast_away( ): " << foo << endl;
    
        strcpy( foo, "Hello!" );
    
        cpp_cast_away( foo );
        cout << "after cpp_cast_away( ): " << foo << endl;
    
        delete [ ] foo;
    }
    

    Greetz, Swordfish



  • LOL, wer hat den bitte sowas erfunden ?!, das ist doch total sinnlos 😮

    Wenn ich const haben will, dann will ich auch const haben 💡

    Aber ok 'leuchtet ein'^^...

    PS: Einer meiner Compiler meckert auch bei deiner ersten Funktion (MVC++ 6.0)



  • CodeFinder schrieb:

    LOL, wer hat den bitte sowas erfunden ?!, das ist doch total sinnlos 😮

    Wenn ich const haben will, dann will ich auch const haben 💡

    Nö, macht doch nur, was man ihm sagt

    const char *constant;
    char *not_constant = ( char* ) constant;
    

    er wandelt "const char*" nach "char*". Der eigentliche Pferdefuß ist der, daß sowas in C mal eben so aus versehen passiert. In C++ ist es wegen des const_cast< > operators nicht mehr möglich, sich "aus versehen" in's Knie zu schießen. Dazu braucht's dann halt 'ne gehörige Portion Absicht. 😃

    CodeFinder schrieb:

    [...] Einer meiner Compiler meckert auch bei deiner ersten Funktion (MVC++ 6.0)

    Das ist auch gut so! Aber denkst du nicht, du solltest ihn dann mal "in Frieden ruhen" lassen!?

    Greetz, Swordfish


  • Mod

    obwohl die beschränkung, dass von den template-style casts nur const_cast in der lage ist, const-qualifikation wegzucasten, wichtig ist, so ist doch ein C-style cast noch in anderer hinsicht etwas ganz anderes als ein static_cast.
    als faustregel gilt, dass mit static_cast alle die konvertierungen möglich sind, die auch implizit erlaubt sind, sowie deren umkehrungen (mit ausnahme des wegcastens von const)
    ein C-style cast hat, in derselben situation angewandt, denselben effekt. er erlaubt allerdings noch weitere konvertierungen: solche, die ein static_cast mit einem const_cast kombinieren. und solche, die sonst nur mittels reinterpret_cast (ggf. ergänzt mit const_cast) möglich sind. das bedeutet, dass ein bestimmter ausdruck, der einen c-style cast enthält, möglicherweise kontextabhängige bedeutung hat (was eigentlich immer schlecht ist). beispiel:

    struct A;
    struct B;
    B* foo(A* p) { return (B*)p; } // reinterpret_cast<B*>(p);
    struct A {};
    struct B: A {};
    B* foo(A* p) { return (B*)p; } // static_cast<B*>(p);
    

    das schlimme daran ist, dass ein compiler hier nicht einmal warnt, wenn der cast al s reinterpret_cast interpretiert wird.



  • Swordfish schrieb:

    Nö, macht doch nur, was man ihm sagt

    Ja, klar macht er, was man ihm sagt...aber findest du die Idee eines const-Casts sinnvoll (mal davon abgesehen der ein const-Cast in C++ offentlichtlicher ist) ? - Hast du den jemals verwendet ? ➡ ⚠
    Also irg.-wie strebt der gegen meine Logik 😃 🤡

    Swordfish schrieb:

    Das ist auch gut so! Aber denkst du nicht, du solltest ihn dann mal "in Frieden ruhen" lassen!?

    Greetz, Swordfish

    Jo auf jeden Fall 😉 naja der Comp. is sowieso voller Bugs... 👎

    PS: Danke nochmal für das erläuternde Beispiel bzgl. C/C++ und const-Casts 👍



  • CodeFinder schrieb:

    Ja, klar macht er, was man ihm sagt...aber findest du die Idee eines const-Casts sinnvoll (mal davon abgesehen der ein const-Cast in C++ offentlichtlicher ist) ? - Hast du den jemals verwendet ? ➡ ⚠
    Also irg.-wie strebt der gegen meine Logik 😃 🤡

    Ja, ist praktisch, wenn man an Code von anderen darf, die keine Ahnung von const correctness haben.



  • Michael E. schrieb:

    CodeFinder schrieb:

    Ja, klar macht er, was man ihm sagt...aber findest du die Idee eines const-Casts sinnvoll (mal davon abgesehen der ein const-Cast in C++ offentlichtlicher ist) ? - Hast du den jemals verwendet ? ➡ ⚠
    Also irg.-wie strebt der gegen meine Logik 😃 🤡

    Ja, ist praktisch, wenn man an Code von anderen darf, die keine Ahnung von const correctness haben.

    Bezug ? ⚠



  • Beispiel:

    // foo.h (gehört zu ner Lib)
    
    void print(Bar &b)
    {
        cout << b;
    }
    
    // end of foo.h
    
    // baz.cpp
    
    #include "foo.h"
    #include "bar.h"
    
    const Bar bar(42);
    
    print(bar);    // error, shit!
    print(const_cast<Bar>(bar));    // klappt :)
    

    Die Funktion print() aus ner externen Lib übernimmt kein konstantes Bar-Objekt, obwohl sie es nicht verändert. Wenn ich jetzt wie in baz.cpp ein konstantes Objekt hab, meldet mir der Compiler beim Aufruf von print(bar) einen Fehler.


Anmelden zum Antworten