reinterpret_cast 问题??

duyouxuanduyouxuan 2009-05-29 07:46:35
HTREEITEM item = m_eTree.GetRootItem();
DWORD_PTR dataD = m_eTree.GetItemData(item);
PlayObject* rootItemData = reinterpret_cast<PlayObject*> (dataD);
CString name = (LPCWSTR)rootItemData->EnDeName;
CString text = m_eTree.GetItemText(item);

PlayObject* rootItemData = reinterpret_cast<PlayObject*> (dataD);
写法和
PlayObject& rootItemData = reinterpret_cast<PlayObject&> (dataD);
的区别??
有没有人给我解释一下,哪种正确??
...全文
323 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
axx1611 2009-05-30
  • 打赏
  • 举报
回复
逻辑写坏了吧,SB了吧,重构吧……
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 pathuang68 的回复:]
推荐楼主看看这篇文章:区别:static _cast、dynamic _cast、reinterpret_cast和const_cast
[/Quote]

很好
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
但是区分32位和64的以后,void*应该分别是32和64位了。
bbb332 2009-05-29
  • 打赏
  • 举报
回复
学习了
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 hikaliv 的回复:]
楼主 void 是一位……同char……
[/Quote]

void*都是32位的。
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 goodname 的回复:]
这种用法真的很不好,还得区分32位还是64位的指针,非常的极不推荐这么使用,探讨一下还是可以的.

你的dataD其实存储的是一个指针值,这个指针指向你的PlayObject对象.将这个指针的值取出来就可以.

你最后这种感觉应该也能行吧.
[/Quote]



你说得很对。区分32位还是64位的指针不好。
pathuang68 2009-05-29
  • 打赏
  • 举报
回复
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 hikaliv 的回复:]
http://topic.csdn.net/t/20051130/15/4428742.html

楼主先看一眼这个再说。
[/Quote]


我看过了。
光宇广贞 2009-05-29
  • 打赏
  • 举报
回复
楼主 void 是一位……同char……
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 goodname 的回复:]
你似乎有些混了,我被你也有说得有些糊涂了

*(PlayObject*)dataD != dataD

举例来说

int x;

这样才是
*(int *)&x == x
[/Quote]


你说的很对。。我混淆了。*(PlayObject*)dataD != dataD
光宇广贞 2009-05-29
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20051130/15/4428742.html

楼主先看一眼这个再说。
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 hikaliv 的回复:]
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (dataD);

像这句话也一样,你可以保证 dataD 可以按比特位安全地复制到 rootItemData 中去就行,注意它可是一个32位长的,可是你的 dataD是多长可就不知道了。
[/Quote]

dataD 程序可能区分32位和64位了。但是void*是多少位的呢??????????

PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(void*)dataD); 却不对。





goodname 2009-05-29
  • 打赏
  • 举报
回复
你似乎有些混了,我被你也有说得有些糊涂了

*(PlayObject*)dataD != dataD

举例来说

int x;

这样才是
*(int *)&x == x
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (dataD);
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(void*)dataD);
两个dataD,(*(PlayObject*)dataD不是一样吗??



PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(void*)dataD);
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(PlayObject*)dd);
两个不是样吗?void* ,PlayObject*,都是指针类型;(*(void*)dataD); (*(PlayObject*)dataD),最后结果还是dataD吗??

goodname 2009-05-29
  • 打赏
  • 举报
回复
这种用法真的很不好,还得区分32位还是64位的指针,非常的极不推荐这么使用,探讨一下还是可以的.

你的dataD其实存储的是一个指针值,这个指针指向你的PlayObject对象.将这个指针的值取出来就可以.

你最后这种感觉应该也能行吧.
光宇广贞 2009-05-29
  • 打赏
  • 举报
回复
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (dataD);

像这句话也一样,你可以保证 dataD 可以按比特位安全地复制到 rootItemData 中去就行,注意它可是一个32位长的,可是你的 dataD是多长可就不知道了。
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
我说错了。
PlayObject& rootItemData = reinterpret_cast<PlayObject&> (dataD);
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(void*)dd);
不行???

但是
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(PlayObject*)dd);
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(int *)dd);
都行。
光宇广贞 2009-05-29
  • 打赏
  • 举报
回复
reinterpret_cast 仅仅是复制指定的比特位到返回值,并不进行检查。

你进行了一次 *(int *)dd 之后,那么这个 * 出来的是一个什么呢?是一个 int 长度的东西。

它将被按位复制到 rootItemData 中去。

而(*(PlayObject*)dd); 呢?它的*出来的是一个多长的东西?可以按位给rootItemData 而不出事儿么?
duyouxuanduyouxuan 2009-05-29
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 goodname 的回复:]
直接使用int看看
HTREEITEM item = m_eTree.GetRootItem();
DWORD dataD = m_eTree.GetItemData(item);
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(int *)dd);
[/Quote]


结果是对的,很牛的人啊。但是为什么像下面这样不行呢??
HTREEITEM item = m_eTree.GetRootItem();
DWORD dataD = m_eTree.GetItemData(item);
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(PlayObject*)dd);

goodname 2009-05-29
  • 打赏
  • 举报
回复
直接使用int看看
HTREEITEM item = m_eTree.GetRootItem();
DWORD dataD = m_eTree.GetItemData(item);
PlayObject& rootItemData = reinterpret_cast <PlayObject&> (*(int *)dd);
加载更多回复(26)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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