找回密码
 注册创意安天

圆环套圆环之迭代器

[复制链接]
发表于 2009-7-23 13:34 | 显示全部楼层 |阅读模式
andy
普通会员
发贴: 104
积分: 0
来自:
注册日期: 2006-05-17
  发表时间: 2006-06-07 23:08:35  
--------------------------------------------------------------------------------
话说这一日是风平浪静,万里乌云,俺的心情好的没得说,收到命令清理A区(写部分代码,其中有在VC6下己完成的代码要移植到VC7下),一路上很轻松,用‘饭得标’的话来说就是‘卡卡’地!在快完成时出现错误。
error C2440: “类型转换” : 无法从“std::vector<_Ty>:terator”转换为“PPkgHead”
with
[
_Ty=BYTE
]
出错代码PPkgHead pHead = (PPkgHead )m_vPkgRecv.begin();
晕之,在VC6下可以编译通过的呀!看看为啥不让转换呢?看了一下返回值是std::vector<BYTE>:terator 或是 std::vector<BYTE>::const_iterator , 在begin()后面加了一个点看到了iterator有下面还有一个iterator(果然是圆环套圆环)和加、减、[]等运算符操作,很是郁闷应该怎么转换呢?到vector里看了一下原来是一个类 class iterator 在里面看到了几个函数
const_reference operator*() const
{ // return designated object

return (*_Myptr);
}

const_iterator& operator++()
{ // preincrement
++_Myptr;
return (*this);
}
const_iterator& operator--()
{ // predecrement
--_Myptr;
return (*this);
}
看到这里激动无比呀,可以确定出_Myptr就是当前的指针!修改代码
std::vector<BYTE>:terator p = m_vPkgRecv.begin();
PPkgHead pHead = (PPkgHead )p._Myptr;
编译通过,哈哈!一直不明白为啥VC7中在P后加点不显示这个成员!另外在网上找到另一个解决方案是PPkgHead pHead = (PPkgHead )&(*m_vPkgRecv.begin());这个强制转换真是强呀,哈哈!不知道兄弟们谁还有更好的方案!

<---- 以上言论仅代表本人立场 ---->

   

swordlea
版主
发贴: 652
积分: 0
来自: 论坛神游夜
注册日期: 2006-05-16
  发表时间: 2006-06-07 23:12:51  
--------------------------------------------------------------------------------
看标题是奥运会献礼帖啊。
<---- 以上言论仅代表本人立场 ---->

__________________
- Is life always this hard,or it just when you're a kid?
- Always like this.  
   

david
版主
发贴: 4
积分: 0
来自:
注册日期: 2006-05-22
  发表时间: 2006-06-08 04:34:28  
--------------------------------------------------------------------------------
呵呵, 感觉被骗了, 我以为是andy实现了一个超无敌可嵌套,可递归,无法再bt的迭代器咧。

<---- 以上言论仅代表本人立场 ---->

__________________
灯火辉煌的大堂让我麻木呆滞,
烛光闪烁的小屋却带给了我无尽的灵感。  
   

david
版主
发贴: 4
积分: 0
来自:
注册日期: 2006-05-22
  发表时间: 2006-06-08 04:37:18  
--------------------------------------------------------------------------------
不过看了上文, 觉得可以这样调用嘛:
假设你如此定义
struct PkgHead
{
int a;
};
可以这样使用
vector<PkgHead>:terator iter = m_vPkgRecv.begin();
if( iter != m_vPkgRecv.end() )
{
iter->a = 100;
(*iter).a= 100;
}
这是C++标准的使用方法。 如果你想得到指针,那就用 &(*iter) 好了。
原因很简单,看这里, 每个vector中的 iterator 都会实现如下两种operator:
reference operator*() const
_Tptr operator->() const
也就是说:当且仅当 [], "*" 或"->" 的调用才是直接作用于对象实体的。
你在网上找到另一个解决方案:PPkgHead pHead = (PPkgHead )&(*m_vPkgRecv.begin());其实就是这种组合。
分两个步骤: 1.*iter得到实体引用。
2.然后继续的 &操作可以得到实体地址。
但是这种方法很危险, 它等同于 &m_vPkgRecv[0]。为什么呢, 你看看m_vPkgRecv.begin()很有可能会返回m_vPkgRecv.end(),也就是说你的vector为空的话, 系统肯定会赏你个大大的异常, 安全第一呀!
最后简单说说andy的做法。说实话,andy的源码解析的能力和解决问题的能力都是毋庸置疑的。 但是不得不提醒一下, 微软之所以没有让你看到这个成员_MyPtr, 是有原因的。凡是没有在C++标准中体现出的代码, 微软都有权利在不doc你的情况下偷偷更换。换一套编译器,很可能就编译不过去了。
莫要以为在苦行中求得的都是彩蛋, 他也可能是枚炸弹。呵呵, 说得可能有些严重了, 莫怪莫怪。
最后得感谢 Andy把这个问题贴了出来, 相信很多人都遇到过的。
<---- 以上言论仅代表本人立场 ---->

__________________
灯火辉煌的大堂让我麻木呆滞,
烛光闪烁的小屋却带给了我无尽的灵感。  
   

andy
普通会员
发贴: 104
积分: 0
来自:
注册日期: 2006-05-17
  发表时间: 2006-06-08 16:29:34  
--------------------------------------------------------------------------------
哈哈,To david:
忘了说了,呵呵,m_vPkgRecv是这样声明的
std::vector <BYTE> m_vPkgRecv; 由于m_vPkgRecv是BYTE类型我们现在要解决的是如何把一个BYTE型的iterator 转为 PkgHead 结构指针,不知道David有什么好的方法?
此贴由andy在 2006-06-08 09:31 编辑过。
<---- 以上言论仅代表本人立场 ---->

   

david
版主
发贴: 4
积分: 0
来自:
注册日期: 2006-05-22
  发表时间: 2006-06-08 18:51:37  
--------------------------------------------------------------------------------
文中介绍啦:

david 提到:
分两个步骤: 1.*iter得到实体引用。
2.然后继续的 &操作可以得到实体地址。

所以
if( iter != m_vPkgRecv.end() )
{
BYTE *p = &*iter;
}
是不是你想要的? 呵呵。
<---- 以上言论仅代表本人立场 ---->

__________________
灯火辉煌的大堂让我麻木呆滞,
烛光闪烁的小屋却带给了我无尽的灵感。  
   

andy
普通会员
发贴: 104
积分: 0
来自:
注册日期: 2006-05-17
  发表时间: 2006-06-09 21:21:02  
--------------------------------------------------------------------------------
that's right, 和网上的一样,呵呵,不过if( iter != m_vPkgRecv.end() ) 这个判断还是要做的,呵呵,不然。。。
<---- 以上言论仅代表本人立场 ---->

相关帖子

您需要登录后才可以回帖 登录 | 注册创意安天

本版积分规则

Archiver|手机版|小黑屋|创意安天 ( 京ICP备09068574,ICP证100468号。 )

GMT+8, 2025-2-23 14:38

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表