2
class A
{
public:
    A* operator->() const
    {
    }
    void Test() {}
};

次に、このように呼び出します。

A* a = new A;
a->Test();

コードは VC2010 で正常にビルドおよび実行されます。とても奇妙に思えます。設計によるものなのか、VC2010 のバグなのか疑問に思っています。

ありがとう

4

2 に答える 2

3

operator->あなたの例ではあなたのを呼び出していません.あなたはTestから直接呼び出していA*ます. あなたがしたい:

(*a)->Test();

または...

A a;
a->Test();

VS2010に関しては何も問題はありませんoperator->(私が知っていることです)。

->という名前のポインターで使用すると、a効果的に実行されます(*a).->値で変数を使用すると、存在するoperator->場合は呼び出され、存在しない場合は構文エラーになりますoperator->

于 2012-06-15T16:42:32.953 に答える
1

あなたのコードは次のとおりです。

A* a = new A;
a->Test();

「a」は A へのポインタです。これは A オブジェクト自体ではなく、ヒープ上の A オブジェクトのメモリ アドレスです。

呼び出すときにa->Test()、ポインターの -> 演算子を呼び出します (C++ のすべてのポインター型に組み込まれています)。オペレーターを呼び出すには、次のようにする必要があります。

//Create an A (NOT a pointer).
A a;

//Invoke the A's operator ->
a->Test();

これが STL イテレータの仕組みです。それらはクラス型であり、クラス型へのポインタではありません。operator -> の戻り値の型は、呼び出そうとしている操作/メンバーにとって意味のあるものでなければならないことに注意してください。

それで、これは -> 経由で test を呼び出す例です:

#include <iostream>

class A
{
public:
    A* operator->()
    {
        return this;
    }
    void Test() { std::cout << "Hello World!"; }
};

int main()
{
    A a;
    a->Test();
}

奇妙ですがa->Test();、現在のオブジェクトを返し、それTest()が呼び出されるため機能します (return this;行を参照)。

実際にこれを行う理由の有用な例については、STL イテレータを参照してください。

于 2012-06-15T16:53:11.707 に答える