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 迭代器以获取有关您实际想要执行此操作的有用示例。