2017-01-02 8 views
0

この演算子を持つクラスが互いにネストしたときに演算子 - >()が複数回展開できますか? 次のサンプルでは、​​式c-> foo()がc.operator - >() - > foo()に展開され、展開の2回目の反復が発生すると予想されますが、きちんとした構文でネストされているときに演算子をオーバーロードする方法はありますか?C++でネストされたオーバーロードされた演算子 - >()

class A 
    { 
    public: 
     void foo() {} 
    } 
    class B 
    { 
    private: 
     A* _a; 
    public: 
     A* operator->() const 
     { 
      return _a; 
     } 
    }; 

    class C 
    { 
    private: 
     B* _b; 
    public: 
     B* operator->() const 
     { 
      return _b; 
     } 
    }; 

    C c; 

    c->foo(); // Desired syntax, but error: 'foo' is not a member of 'B' 
    c.operator->()->operator->()->foo(); // Ok, but makes no sense 

この質問を理論的に考えてください!

+0

'c.operator - >()'はポインタを返します。 ' - >'の連鎖的なアプリケーションは、必然的に組み込みの逆参照演算子です。それがオーバーロードされた演算子であるためには、 'c.operator - >()'はあるクラスのインスタンスまたはその参照を返しますが、ポインタは返しません。 –

+0

それはまさに私が行方不明だったものです! – user3348108

+0

クラスCがstd :: unique_ptrであると考えると、戻り値だけ異なる演算子にはオーバーロードできません – user3348108

答えて

0

連鎖は、結果が別のクラス型である場合にのみ発生します。

B& operator->() const 
{ 
    return *_b; 
} 

明らか_bは、実際のコードではNULLポインタである可能性には注意してください:あなたは、Cのバージョンはようなものにする必要があると思います。