objekt über const pointer verändern?



  • hallo, ich hab ein kleineres problem mit der const correctness.

    ich habe in einer klasse einen pointer der constant auf einen speicherbereich zeigen soll,ich habs mit:

    const T* Pointer;
    

    versucht, aber das hatte zufolge, dass

    Pointer->a=1;
    

    nicht durchgeführt werden konnte.
    wie kann ich nun dem compiler einerseits sagen, dass der pointer nicht verändert werden darf, aber das objekt auf welches der pointer zeigt verändert werden kann?



  • wie wäre es mit

    T* const pointer; // const-Zeiger
    
    const T *zeiger;
    T const *zeiger; // beides const-Objekte
    


  • const T * foo; // zeiger auf const Objekt
    T const * foo // const Zeiger auf Objekt
    const T const * foo // const Zeiger auf const Objekt
    


  • ui, da sging schnell, danke euch 😉
    aber noch eine frage, ich war grad auf humme sikkins seite,da wird in bezug auf const correctness von dem logischen zustand eines objektes gesprochen, aber was ist das?



  • SirLant schrieb:

    const T * foo; // zeiger auf const Objekt
    T const * foo // const Zeiger auf Objekt
    const T const * foo // const Zeiger auf const Objekt
    

    Nä...

    const T * foo; // zeiger auf const Objekt
    T const * foo; // dito
    T * const foo; // const zeiger
    const T const * foo // zeiger auf doppelt const Objekt ;)
    const T * const foo; // const Zeiger und const Objekt
    


  • SirLant schrieb:

    const T * foo; // zeiger auf const Objekt
    T const * foo // const Zeiger auf Objekt
    const T const * foo // const Zeiger auf const Objekt
    

    für einen konstanten Zeiger muss der Stern vor const sein sonst ist es nur ein konstantes Objekt!

    int main() 
    { 
        int a;
        int b;
        const int  *const foo = &a; // const Zeiger auf const Objekt 
        foo = &b;
        return 0; 
    }
     //error C2166: L-Wert gibt ein konstantes Objekt an
    

    das ist kein konstanter Zeiger:

    int main() 
    { 
        int a;
        int b;
        const int const *foo = &a;  //warning C4114: Der gleiche Typbezeichner wurde mehrmals verwendet
        foo = &b;
        return 0; 
    }//ist kein Fehler also kann foo nicht konstant sein
    

    (.Net 2002)
    EDIT: zu spät



  • was ist denn ein "doppel const" objekt? das hab ich ja noch nie gehört...



  • otze schrieb:

    was ist denn ein "doppel const" objekt? das hab ich ja noch nie gehört...

    gibts eigentlich nicht...das sagt .Net dazu:

    [Compiler Warning (level 1) C4114]

    Der gleiche Typbezeichner wurde mehrmals verwendet

    Ein Typbezeichner (const, volatile, signed oder unsigned) wird in einer Typdeklaration oder -definition mehrfach verwendet. Bei Verwendung der Microsoft-Erweiterungen (/Ze) wird eine Warnung, bei Einhaltung der ANSI-Kompatibilität (/Za) eine Fehlermeldung ausgegeben.

    Beispiel

    // C4114.cpp
    volatile volatile int i; // C4114



  • löl, den Begriff habe ich mal schnell erfunden, ist natürlich unsinnig der Syntax.



  • ich war grad auf humme sikkins seite

    Hume 😉

    von dem logischen zustand eines objektes gesprochen, aber was ist das?

    Als logischen Zustand bezeichnet man für gewöhnlich den Zustand, der von außen wahrnehmbar ist (und für die Außenwelt relevant ist), sprich der sich über die öffentliche Memberfunktionen abfragen lässt.

    Falls dir das als Antwort nicht genügt, kannst du deine Frage vielleicht etwas konkretisieren?



  • das steht ja in etwa so auf deiner page, aber damit kann ich ehrlichgesagt wirklich nichts anfangen.

    ich brauch für sowas immer code ums zu verstehen...hmm

    class test{
        private:
            int size;
        public:
            int getsize(){return size;}//fragt man hier den logischen zustand ab?
            void setsize(int i){ size=i;}//verändert man hiermit den logischen zustand,oder nur den physischen?
    }:
    

Anmelden zum Antworten