VC问题 一道关于windows映射机制的程序

来源:百度知道 编辑:UC知道 时间:2024/06/04 02:35:58
代码如下:
class CmapPtrToPtr
{
protected:
struct CAssoc
{
CAssoc* pNext;
void* key;
void* value;
};
public:
........................
UINT HashKey(void* key) const;
void SetAt(void* key,void* newValue);
}

inline UINT CMapPtrToPtr::HashKey(void* key) const
{
return ((UINT)(void*)(DWORD)key)>>4;
}

inline void CMapPtrToPtr::SetAt(void* key, void* newValue)
{
(*this)[key] = newValue;
}

这是书上一道浅析windows映射机制的程序代码,有几个地方令人费解,望高人指点,
问题一:
((UINT)(void*)(DWORD)key)应如何理解,这个函数是给定key值计算哈希值。。。。
问题二:
(*this)[key] = newValue;怎么理解,这个函数书上说是添加一个(key,value)对,不太明白。

1. HashKey是哈希表的散列函数,你不需要过份的关注,主要就是为了返回key这个指针所对应的下标。
2.(*this)[key] = newValue,其实也就是在key这个位置插入一个值newValue,这个表达式比较难以理解。其实,在类CMapPtrToPtr中肯定要重载"[]"这个操作符,而(*this)其实就是对象本身,然后(*this)[]这样,其实就是调用重载的那个操作符而已。而operator[](void* key)这个重载函数的返回值,可能是一个被new出来的对象,从而也就是把newValue的值赋给这个被operator[]函数new出来的对象。
其实,你所问的问题与WINDOWS消息循环没有一点联系,这到像是在实现一个Map的类。

关于问题1:
好像是没必要这样写.因为传进来的key本来就是void*类型的.
这个(void*)(DWORD)key就是将key转换为void*类型,再来个UINT,就是把key指针地址转换为UINT,即理解为放在UINT里传出去.
这里其实可以直接写:return (UINT)key >> 4;
关于问题2:
this就是指自己类本身.每个c++类都有自己一个指向自己的指针对象,看c++primal书有说明.前面加*就是代表解引用.指针可以看成是一维数组,有[]操作符.