2017-02-12 12 views
5

オペレータが '。'のためにオーバーロードする場合、難しかったことについて、私はstroutrupからの説明を理解するのに苦労します。許可されました。ドット "を過負荷にすることができません。オペレーターがC++で

演算子:

はビャーネ・ストロヴストルップから、この引用を参照してください。 (ドット)は原則として - >と同じテクニックを使用してオーバーロードすることができます。ただし、そのようにすると、操作がオブジェクトのオーバーロードを対象としているかどうかについての疑問が生じる可能性があります。またはによって参照されるオブジェクト。たとえば:x.f()を実行しながら上記の例では

class Y { 
public: 
    void f(); 
    // ... 
}; 

class X { // assume that you can overload . 
    Y* p; 
    Y& operator.() { return *p; } 
    void f(); 
    // ... 
}; 

void g(X& x) 
{ 
    x.f(); // X::f or Y::f or error? 
} 

はなぜ混乱があるはず?ここで

Y& operator.() { return *p; } 

は私が何を考えている:。

  1. 演算子()ので、Y& operator.()(return *p; }が呼び出されるべきであること、それはobivousで直感的なイマイチx上で呼び出されますか?タイプYの対象となりY::f()を指す*pは(ないX::f())最後に呼び出されなければなりません戻ると

私はstroustupの説明で何をしないのですか?なぜそれは簡単ではないのですか?

+0

"したがって、Y :: f()は最終的に呼び出されるべきです。"しかし、そのコードを読んでいる人には分かりにくいですか?通常 'x.f()'は 'x'の' f'メンバを呼び出しますが、この場合は発生しません。 –

+0

@ScottHunter例がStroustrupのものであり、混乱を説明するとしたら、それは混乱しないはずです:) – AlexD

+0

この[SO質問](http://stackoverflow.com/questions/520035/why-cant-you-overload-the-operator-in-c)は同じ問題について話しています。 –

答えて