class A
{
public:
    A* operator->() const
    {
    }
    void Test() {}
};
然后这样称呼它。
A* a = new A;
a->Test();
代码在VC2010中构建并成功运行。这似乎很奇怪。我想知道这是设计使然还是VC2010的错误?
谢谢
class A
{
public:
    A* operator->() const
    {
    }
    void Test() {}
};
然后这样称呼它。
A* a = new A;
a->Test();
代码在VC2010中构建并成功运行。这似乎很奇怪。我想知道这是设计使然还是VC2010的错误?
谢谢
你没有operator->在你的例子中打电话给你,你是Test直接从A*. 你要:
(*a)->Test();
或者...
A a;
a->Test();
VS2010 没有任何问题operator->(据我所知)。
->在名为a有效的指针上使用执行: (*a).. ->按值对变量使用将调用您operator->(如果存在),或者如果没有operator->.
你的代码是:
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 迭代器以获取有关您实际想要执行此操作的有用示例。