2016-07-29 4 views
0

誰でも、Fooクラスのオーバーロードされた演算子がFoo *型のポインタから呼び出されていない理由を説明できますか?C++のオーバーロードされた演算子 - >()が呼び出されていませんか?

#include <iostream> 
using namespace std; 

class Foo { 
public: 
Foo * operator ->() { 
    cout << "calling Foo * operator ->()\n"; 
    return this; 
} 
    int x; 
}; 


void main() { 
    Foo f; 
    Foo * pF = &f; 
    pF->x;     // Why is overloaded operator-> not being called here? 
    (pF->operator->())->x; // This works. 

    cout << "End test.\n"; 
} 
+0

あなたは、本質的にオペレータを呼び出しているため、2番目の文は動作します - あなたのポインタpFのを使用する方法>。そこには過負荷はありません。以下で解説するように、ポインタではなくインスタンスのオーバーロードしかできません。 –

答えて

6

はなぜここ>と呼ばれていないoperator-過負荷になっていますか?

pFはポインタであるため、Fooインスタンスではありません。 Foooperator->がオーバーロードされていますが、Foo*にはオーバーロードされていません。オーバーロードされたoperator->fに直接呼び出すことができます。

f->x; 

あなたはFoo*またはその他のポインタ型のためoperator->が過負荷にならないことがあります。

+0

まあ、暗黙的なポインタ仮想アドレスシステムへの私の希望が向いています。クライアントにFoo *を与え、メモリ内のFooオブジェクトを移動(最適化)できるようにし、Foo *がオブジェクトを修正するように依頼します。私はスマートなポインタコンテナクラスを使用するように見えます。 –

3

Foo*ではなく、Fooにオーバーロードしました(これは不可能です)。もちろん、

(f.operator->())->x; 

をまたは::

この

が働いているだろう

f->x; 

はその短い構文を使用することができることがない、過負荷の全体の目的は?演算子を呼び出すのと同じオブジェクトへのポインタを返すのは非常に混乱しますが。

+0

どうしてラウンドアバウトの呼び出し方法?単に 'f-> x'だけではないのですか? –

+0

@Revolver_Ocelot:そうですか。私はOPの意図を維持したいが、直接のバグを修正したい。 –

+0

@ HiI'mFrogatto:いいえ、 'operator->'の全体的なポイントは、 'f-> x'をLOLにすることです –

2

タイプFooの「ポイントツー」演算子がオーバーロードされています。タイプはFoo*ではありません。使い方の

class Foo { 
public: 
    // Overload 'point-to' operator of 'Foo' 
    Foo * operator ->() { 
     cout << "calling Foo * operator ->()\n"; 
     return this; 
    } 
    int x; 
}; 

例:

Foo f; 
f.operator->();