2017-01-01 81 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