class A
{
public:
A* operator->() const
{
}
void Test() {}
};
然后这样称呼它。
A* a = new A;
a->Test();
代码在VC2010中成功构建并运行。这看起来很奇怪。我想知道它是设计还是VC2010的错误?
由于
答案 0 :(得分:3)
您未在示例中致电operator->
,而是直接从Test
致电A*
。你想要:
(*a)->Test();
或者...
A a;
a->Test();
关于operator->
(我知道),VS2010没有任何问题。
在名为->
的指针上使用a
可以有效地执行:(*a).
。对值变量使用->
将调用operator->
(如果存在),如果没有operator->
则会出现语法错误。
答案 1 :(得分:1)
您的代码是:
A* a = new A;
a->Test();
“a”是指向A的指针。它不是A对象本身,它是堆上A对象的内存地址。
当你拨打a->Test()
时,你会调用指针 - > operator(内置于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迭代器,了解您实际想要执行此操作的有用示例。