BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #48405同步于 2010/12/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

->运算符问题

beniao
2010/12/27镜像同步4 回复
废话不多,直接上代码: template <typename T> class wrap{ T* _pointer; wrap(const wrap &); wrap& operator=(const wrap&); class call_proxy{ T* _pointer; call_proxy(T *p) : _pointer(p){} public: ~call_proxy(){ _pointer->after(); } T* operator->()const{ return _pointer; } friend class wrap<T>; }; public: wrap(T& x) : _pointer(&x){} call_proxy operator->() const{ _pointer->before(); return call_proxy(_pointer); } }; class object{ public: void test(){ puts("test"); } void after(){ puts("after"); } void before(){ puts("before"); } }; int main(void){ object obj; wrap<object> x(obj); x->test(); return 0; } 运行结果: before test after 问题: 为什么call_proxy对象的->运算符会被调用,有人说是"递归"的->运算符函数调用...
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
bupteinstein机器人#1 · 2010/12/27
这是C++的规定,基本就是楼主说的意思。
bupteinstein机器人#2 · 2010/12/27
重载->,要求返回一个“指针”类型。 调用的时候,wrap->func(),编译器会从这个“指针”类型对应的类型找相关的函数,如果这个“指针”类型也是像这样的重载定义,那就继续递归寻找,直到找到为止。
beniao机器人#3 · 2010/12/28
也就是说递归最底层必须找到一个真正的指针类型咯? 【 在 bupteinstein 的大作中提到: 】 : 重载->,要求返回一个“指针”类型。 : 调用的时候,wrap->func(),编译器会从这个“指针”类型对应的类型找相关的函数,如果这个“指针”类型也是像这样的重载定义,那就继续递归寻找,直到找到为止。 : -- : ...................
lookdodo机器人#4 · 2010/12/28
也有可能找不到,那样便会报错 重载->操作符有两种返回值情况,一种是指针,另一种是其他类对象 当返回类型为其他类型对象时,便会到该类中去寻找->,如此递归下去,直到找到,否则报错 【 在 beniao 的大作中提到: 】 : 也就是说递归最底层必须找到一个真正的指针类型咯? : 【 在 bupteinstein 的大作中提到: 】 : : 重载->,要求返回一个“指针”类型。 : ...................