2017-01-01 5 views
-1

Ich habe eine Klasse (C) mit einer Memberklasse (B), die eine dritte Klasse (A) verfolgt. Wie lautet die richtige Syntax, um die öffentlichen Funktionen von A über C und B aufzurufen? Oder habe ich meine Zeiger vermasselt?Aufrufen von Elementfunktionen über mehrere Zeiger

#include <iostream> 

class A 
{ 
    public: 
     void Hello() const {std::cout<<"World."<<std::endl;}; 
}; 

class B 
{ 
    const A* aa;     // Pointer can change, data cannot. 

    public: 
     const A* *const aaa;  // Pointer and pointed value are const. 

     B() : aaa{&aa} {}; 
     void SetPointerToA(const A& aRef) {aa = &aRef;}; 
}; 

class C 
{ 
    B b; 

    public: 
     B* bb;      // Provide access to public members of B. 

     C() : bb{&b} {}; 
}; 

int main() 
{ 
    A aTop; 
    C c; 

    c.bb->SetPointerToA(aTop);  // Tell c.b to modify itself. No problems here. 

    c.bb->aaa->Hello();    // <==== Does not compile. 

    return 0; 
} 

gcc 5.2.0 beschwert sich über den Anruf Hallo():

error: request for member 'A:: Hello' in '*(const A**)c.C::bb->B::aaa', 
which is of pointer type 'const A*' (maybe you meant to use '->' ?) 
+0

@OlegBogdanov 'aa' ist privat. Und 'aaa' ist ein Doppelzeiger. –

+0

'(* (c-> bb-> ​​aaa)) -> Hallo()'. Sie haben das durch Ihre, sagen wir, unkonventionelle Anordnung von Mitgliedern, die Hinweise auf andere Mitglieder sind, auf sich selbst gebracht. –

+1

Warum machen Sie das so kompliziert? Erinnere dich an [KISS] (https://en.wikipedia.org/wiki/KISS_principle) –

Antwort

3

Wenn Sie Aufmerksamkeit schenken, würden Sie feststellen, dass aaa ein Doppelzeiger ist. Daher sollte es sein:

(*c.bb->aaa)->Hello(); 

Having said that: diese Klassen sehen sehr zerbrechlich aus. Sie don't comply with the Rule Of Three, und so werden die Dinge bei jeder Gelegenheit brechen ...

+0

Danke. Ich bezweifle nicht, dass es einen besseren Weg gibt, es zu tun; Das war mehr eine Übung in "Kann ich?" anstatt "sollte ich?" – Twiggy

Verwandte Themen