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 迭代器的工作方式——它们是类类型,而不是指向类类型的指针。请注意,运算符 -> 的返回类型必须对您尝试调用的操作/成员有意义。

因此,这是一个通过 -> 调用 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 回答