关于MFC的POSITION类型的疑问

dawndu 2005-02-26 06:25:58
看mfc源码,有几点疑问,下面是POSITION的定义

// abstract iteration position
struct __POSITION { };
typedef __POSITION* POSITION;

下面是CList中它的用法
AFX_INLINE TYPE& CList<TYPE, ARG_TYPE>::GetNext(POSITION& rPosition) //
{
CNode* pNode = (CNode*) rPosition;
ASSERT(AfxIsValidAddress(pNode, sizeof(CNode)));
rPosition = (POSITION) pNode->pNext;
return pNode->data;
}

三个问题
1.为什么微软不用STL中Iterator的方法来写这个POSITION类?
2.既然不用Iterator,那么用void *类型也是可以,为什么不用?
3.c++怎么来看待空结构,有什么具体的用法和技巧?
...全文
1402 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawndu 2005-02-28
  • 打赏
  • 举报
回复
了解,揭帖
dawndu 2005-02-27
  • 打赏
  • 举报
回复
难道没有人给一个满意的回答吗?
蒋晟 2005-02-27
  • 打赏
  • 举报
回复
1 MFC6出来的时候STL还没出来呢
23 void *的类型太弱了,一个强类型的使用和理解比void *好一些
QunKangLi 2005-02-27
  • 打赏
  • 举报
回复
MFC一直就没打算封装数据结构与算法。它只关心商业上的最有可能应用到的东西。
POSITION其实也有某些迭代器的特征,只是没有使用它的适合多个容器的通用算法。
STL对MFC来说是绝对的晚辈,就不要指望它继承STL的一切思想了。
另外,MFC/STL中任何一门搞精都很了不起了,都是大牛牛。横向比较没得多大意思,存在就是合理的。今天知道了STL就大贬MFC,明天知道了C#就抵制C++,后果么,俺才浅识陋,实在想不出来。
QunKangLi 2005-02-27
  • 打赏
  • 举报
回复
在MFC4.0以前的版本中,POSITION实际上就是一个void指针。在5.0中的定义大概是:
struct __POSITION { int unused; } ;
typedef __POSITION * POSITION ;
6.0中才变为:
struct __POSITION { } ;
typedef __POSITION * POSITION ;
虽然结构内没有成员变量,但指向结构的指针仍需要4字节----32位机中天下的指针都是这个长度滴!

这样做的目的仅是为了类型安全。对于POSITION参数,使用者很容易传错,特别是当表中元素是void *时,此时很有可能在需要元素的地方传入POSITION,而在需要POSITION的地方传入void *。当做上面的定义中,编译器就可以检查出这种错误。

在MFC内部,POSITION实际上指向CNode类型。
QunKangLi 2005-02-27
  • 打赏
  • 举报
回复
在MFC4.0以前的版本中,POSITION实际上就是一个void指
dawndu 2005-02-27
  • 打赏
  • 举报
回复
感谢楼上,是否可以这样理解
1.因为历史原因,mfc的开发人员并不知道如何实现数据结构和算法分离的技术,所以没有使用Iterator
2.所以在当时的情况下,也只有尽可能的使用强类型POSTION来代替void *
dawndu 2005-02-26
  • 打赏
  • 举报
回复
对于楼上的解答表示感谢,但是事实上mfc中没有用迭代器,所以也没有STL中常用的算法的实现,只实现了一些基本的数据结构,如,CArray,但是比如说对CArray查找,排序等算法,小弟是没有见过的。假如有的话,那不是多了一种把算法和数据结构分离的技术?到现在为止,我就知道迭代器是可以做的这点
其实MFC可以考虑这些的,它实现了这些,在它自己的开发环境中对于调试的支持肯定比STL要好得多,但是没有,所以很疑惑!!!
yongdu 2005-02-26
  • 打赏
  • 举报
回复
1.ms用自已的一大堆类实现了stl中常用的类型和算法,原因是它不太想支持stl,但又不得不支持stl,所以msdn上stl的东东也相对较少。
2.无法猜想为什么不用void*
3.试了试空结构,很奇怪
struct SS{};
SS s={0}; 会分配4字节内存做s变量,但并不初始化这4字节为0
int b=sizeof(SS); 为1


16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧