返回信息流废话不多,直接上代码:
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对象的->运算符会被调用,有人说是"递归"的->运算符函数调用...
这是一条镜像帖。来源:北邮人论坛 / cpp / #48405同步于 2010/12/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
->运算符问题
beniao
2010/12/27镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
重载->,要求返回一个“指针”类型。
调用的时候,wrap->func(),编译器会从这个“指针”类型对应的类型找相关的函数,如果这个“指针”类型也是像这样的重载定义,那就继续递归寻找,直到找到为止。
也就是说递归最底层必须找到一个真正的指针类型咯?
【 在 bupteinstein 的大作中提到: 】
: 重载->,要求返回一个“指针”类型。
: 调用的时候,wrap->func(),编译器会从这个“指针”类型对应的类型找相关的函数,如果这个“指针”类型也是像这样的重载定义,那就继续递归寻找,直到找到为止。
: --
: ...................
也有可能找不到,那样便会报错
重载->操作符有两种返回值情况,一种是指针,另一种是其他类对象
当返回类型为其他类型对象时,便会到该类中去寻找->,如此递归下去,直到找到,否则报错
【 在 beniao 的大作中提到: 】
: 也就是说递归最底层必须找到一个真正的指针类型咯?
: 【 在 bupteinstein 的大作中提到: 】
: : 重载->,要求返回一个“指针”类型。
: ...................