2017-01-01 19 views
-1

私は第3のクラス(A)を追跡するメンバクラス(B)を持つクラス(C)を持っています。 CとB経由でAのパブリックメンバー関数を呼び出すための適切な構文は何ですか?または私は私の指針を台無しにしましたか?あなたは細心の注意を払っている場合、あなたはaaaは、ダブルポインタであることに気付くだろう複数のポインタによるメンバ関数の呼び出し

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

#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は、こんにちは()への呼び出しについて不平を言います。したがって、それはする必要があります:

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

これらのクラスは非常に壊れやすいようです。それらはdon't comply with the Rule Of Threeであり、したがって、可能性のあるあらゆる機会に物事が崩壊するでしょう...

+0

ありがとうございます。私はそれを行うより良い方法があることを疑うことはありません。これはもっと "私はできますか?" 「私は?」 – Twiggy

関連する問題