[Pointerschachtelung]Richtig dereferenzieren



  • Folgendes Programm wird nicht uebersetzt. g++ meint:

    dereferencetest.cpp: In function 'int main()':
    dereferencetest.cpp:23: error: expected unqualified-id before '(' token
    dereferencetest.cpp:23: error: 'bar' was not declared in this scope
    

    Die relevante Zeile ist markiert.

    #include <iostream>
    using namespace std;
    
    class Foo;
    class Bar;
    
    class Foo
    {
        public:
        	Bar** bar;
    };
    
    class Bar
    {
        public:
        	void func() { cout << "hi" << endl; }
    };
    
    int main()
    {
    	Foo foo;
    	Foo* f = &foo;
    
            f->(*bar)->func(); //Zeile 23
    }
    

    Eigentlich muesste doch alles richtig dereferenziert sein, oder?

    thx in advance



  • Hi!

    ( *f->bar )->func();
    

    Und für bar hat du keinen Speicher reserviert...

    grüße



  • Danke.

    Nach welchem Algortihmus gehe ich denn im Allgemeinen vor, wenn ich nicht-triviale Pointerverschachtelungen dereferenzieren will?



  • Wie welcher Algorithmus? Du musst einfach so lange dereferenzieren bis du beim tatsächlich "gezeigten" Objekts angekommen bist.



  • Ja, schon klar, aber du musst ja irgendwie auf

    ( *f->bar )->func();
    

    gekommen sein. Und es waere halt ganz gut zu wissen wie.
    Es kann ja auch sein, dass mir demnaechst mal eine kompliziertere Pointerverschachtelung unterkommt und dann moechte ich die moeglichst systematisch, sprich: nach einem Algorithmus, aufschluesseln.
    Das meine ich mit Algorithmus, naemlich eine allgemeine Regel, wie ich Pointerverschachtelungen entschluessele.

    Hoffe, ich habe mich verstaendlich ausgedrueckt 🙂



  • Hi!

    Du musst dir klar werden wir der Ausdruck ausgeführt wird. Du kannst kein Objekt derefernzieren das du noch nicht hast...

    grüße



  • Ok, ich glaub ich weiss, was ich gemacht hab.
    Die Klammer, die ich um *bar gesetzt hab hat zwei Wirkungen!

    • Die erste ist, dass der Ausdruck
    *bar
    

    auch tatsaechlich als

    *bar
    

    interpretiert wird und nicht durch eventuelle Operatorvorraenge z.B. zuerst die Funktion aufgerufen wird und so etwas passiert:

    *(bar->func())
    
    • Die zweite Wirkung ist, dass das am meisten "in der Mitte" stehende Klammernpaar in einem Ausdruck als Erstes ausgewertet wird. Durch mein gesetztes Klammernpaar wird also die Auswertungsreihenfolge des Ausdrucks geaendert und es wird versucht eine Variable bar im aktuellen Scope zu dereferenzieren, die natuerlich nicht existiert.

    Da muss ich in Zukunft mal ein bisschen drauf achten, dass so eine Klammer in einem Ausdruck immer zwei Funktionen hat.


Log in to reply