2017-01-01 80 views
-1

我有一個類(C)和一個跟蹤第三類(A)的成員類(B)。通過C和B調用A的公共成員函數的正確語法是什麼?還是我搞砸了我的指針?通過多個指針調用成員函數

#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抱怨調用你好():

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'是私人。而'aaa'是一個雙指針。 –

+0

'(*(c-> bb-> aaa)) - > Hello()'。你提出了這個問題,我們可以說,非常規安排會員指向其他成員。 –

+1

你爲什麼這麼複雜。請記住[KISS](https://en.wikipedia.org/wiki/KISS_principle) –

回答

3

如果您密切關注,你會注意到aaa是雙指針。因此,它應該是:

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

話雖如此:這些類看起來非常脆弱。他們don't comply with the Rule Of Three,因此,事情將在每一個可能的機會...

+0

謝謝。我不懷疑有更好的方法來做到這一點;這更多的是「我能嗎?」的練習。而不是「我應該嗎?」 – Twiggy