为什么运算符>重载在 VC2010 中不起作用?
Why does operator-> overloading not work in VC2010?
class A
{
public:
A* operator->() const
{
}
void Test() {}
};
然后这样称呼它。
A* a = new A;
a->Test();
代码在 VC2010 中成功生成并运行。这似乎很奇怪。我想知道这是设计使然还是VC2010的错误?
谢谢
您在示例中不是在调用operator->
,而是直接从A*
调用Test
。你想要:
(*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 迭代器,了解您实际想要这样做的原因的有用示例。
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- "set_unexpected"在VC2010中不起作用?
- 为什么运算符>重载在 VC2010 中不起作用?