k***s 发帖数: 277 | 1 也算是c++老手了,今天遇到一个和奇怪的问题,具体
见以下程序。关键是set(),set2()的结果不同,也就是
set : ((c_base*)this)->operator[](i) = p;
set2: ((c_base)*this).operator[](i) = p;
的区别在那里?(set2无法改变数组元素)
我用的是linux, gcc 3.4.6,结果是:
0 : 1
1 : 2
2 : 3
0 : 1
1 : 2
2 : 3
0 : 1
1 : 0
2 : 3 | t****t 发帖数: 6806 | 2 当然不同
(c_base*)this是把指针类型转换,指向的还是原来的地方
(c_base)*this是创造临时对象,换地方了,当然不能改原来值
老革命遇到新问题????
【在 k***s 的大作中提到】 : 也算是c++老手了,今天遇到一个和奇怪的问题,具体 : 见以下程序。关键是set(),set2()的结果不同,也就是 : set : ((c_base*)this)->operator[](i) = p; : set2: ((c_base)*this).operator[](i) = p; : 的区别在那里?(set2无法改变数组元素) : 我用的是linux, gcc 3.4.6,结果是: : 0 : 1 : 1 : 2 : 2 : 3 : 0 : 1
| t****t 发帖数: 6806 | 3 BTW, 不知道你干嘛要overload这些,直接用父类的就好了
【在 t****t 的大作中提到】 : 当然不同 : (c_base*)this是把指针类型转换,指向的还是原来的地方 : (c_base)*this是创造临时对象,换地方了,当然不能改原来值 : 老革命遇到新问题????
| D****g 发帖数: 2860 | 4 区别是后者是把value转换了(a new instance is created)
【在 k***s 的大作中提到】 : 也算是c++老手了,今天遇到一个和奇怪的问题,具体 : 见以下程序。关键是set(),set2()的结果不同,也就是 : set : ((c_base*)this)->operator[](i) = p; : set2: ((c_base)*this).operator[](i) = p; : 的区别在那里?(set2无法改变数组元素) : 我用的是linux, gcc 3.4.6,结果是: : 0 : 1 : 1 : 2 : 2 : 3 : 0 : 1
| k***s 发帖数: 277 | 5 你说的对。我一直没有写过类似的代码,所以没有太注意。
新水上有人也给过解答. 正确的写法有好几种,
((c_base*)this)->operator[](i)
((c_base&)*this).operator[](i)
this->c_base::operator[](i)
我现在用的是最后一种,觉得比较简洁明了
【在 t****t 的大作中提到】 : 当然不同 : (c_base*)this是把指针类型转换,指向的还是原来的地方 : (c_base)*this是创造临时对象,换地方了,当然不能改原来值 : 老革命遇到新问题????
| k***s 发帖数: 277 | 6 我用deque作为基类, 写了一个管理指针的container,
不过我只需要push_back, pop_back, size的几个接口。
【在 t****t 的大作中提到】 : BTW, 不知道你干嘛要overload这些,直接用父类的就好了
| t****t 发帖数: 6806 | 7 我的意思是你根本不需要写push_back, op[], size,因为你反正是调用父类的,写不写
都一样,不写说不定还速度快点
【在 k***s 的大作中提到】 : 我用deque作为基类, 写了一个管理指针的container, : 不过我只需要push_back, pop_back, size的几个接口。
| k***s 发帖数: 277 | 8 比如pop_back, 作为指针,我还需要delete.
另外我也不希望直接用[] operator来改变指针的值。
【在 t****t 的大作中提到】 : 我的意思是你根本不需要写push_back, op[], size,因为你反正是调用父类的,写不写 : 都一样,不写说不定还速度快点
|
|