指针类型转换,难题

sunlightbj 2007-10-25 04:02:13

现在要做一个指针类型转换,把void* a 变成CDMClass*

原来写的是(CDMClass*)a,未能通过公司的编码规则自动检查器,违反了“不能用c语言风格cast”这一条;

于是改成reinterpret_cast<CDMClass*>(a),又违反了“不允许使用reinterpret_cast”这一条;

大家还有什么招数能做指针类型的转换吗?static_cast不能用于指针转换,VS2003编译不通过
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xylophone21 2007-10-25
  • 打赏
  • 举报
回复
试试把void*
换成

unio{
CDMClass* cdmP;
XXXX* xxxP//所有void*可能的指向类型:)
...
}

吧,如果static_cast不行的话
  • 打赏
  • 举报
回复
倒是可以使用这种BT的做法,VC8下连警告都没有

#include <stdio.h>
#include <stdarg.h>

class test
{
int x;
public:
test(int _x):x(_x){}
void out()
{
printf("%d\n",x);
}
~test()
{
printf("test::~test\n");
};
};

test* my_conv( int i, ...)
{
va_list argptr;
va_start(argptr, i);
return va_arg( argptr, test* );
}
int main()
{
void* p = new test(3213);
test* pt = my_conv( 0 ,p );
pt->out();
delete pt;
return 0;
}
jixingzhong 2007-10-25
  • 打赏
  • 举报
回复
不能用c语言风格cast
不允许使用reinterpret_cast
...

static_cast 如果可以使用,
那么可以使用 static_cast 完成类型转换。

如果不可以使用,
那么,就无法使用 void * 操作了,
修改传递时候的类型为目标类型,或者是可以隐式转换到目标类型的某个类型。
  • 打赏
  • 举报
回复
不能用c语言风格cast
不允许使用reinterpret_cast
这两条已经足够限制你 不能用void*
你可以试试看用boost::any
ckt 2007-10-25
  • 打赏
  • 举报
回复
static_cast不能用于指针转换,VS2003编译不通过
---------
你使用有问题吧?

CDMClass* pCDM = new CDMClass;
void* a = static_cast<CDMClass*>(pCDM);
老腊肉泡酒 2007-10-25
  • 打赏
  • 举报
回复
公司还真麻烦,用C风格的也不是不好啊.看着也蛮好看的啊.
独孤过儿 2007-10-25
  • 打赏
  • 举报
回复
我个人觉得还是应该用 static_cast,可能楼主在某处疏忽了,所以.NET 才拒绝编译的,这种标准中显示定义的东西,它应该会支持的啊。

独孤过儿 2007-10-25
  • 打赏
  • 举报
回复
楼主试试看这段代码能在VS2003下编译通过不,我没有那个环境
#include <iostream>
using namespace std;

class Test
{
public:
Test(){}
};


int main()
{
Test* t;
void* pv = new Test;
t = static_cast<Test*> (pv);

return 0;
}


对楼上的做法有点怀疑,dynamic_cast 和 static_cast 的使用场合是不同的,static_cast 作用于编译期,synamic_cast 作用于运行期,是为了实现RTTI

机制而设计的。如果楼主使用的场合是编译期,那用dynamic_cast也解决不了问题,而且可能会更糟糕。
quentinliu 2007-10-25
  • 打赏
  • 举报
回复
谁知道你公司还有什么不允许的啊,看看这样行不行

CDMClass* b = dynamic_case<CDMClass*>a
andy_cai 2007-10-25
  • 打赏
  • 举报
回复
第一次看到五星的,发个帖子。。。
Vitin 2007-10-25
  • 打赏
  • 举报
回复
static_cast一定是可以的.C++标准2003 在 5.2.9[expr.static.cast] 中明确说:

An rvalue of type “pointer to cv1 void” can be converted to an rvalue of type “pointer to cv2 T,” where T is an object type and cv2 is the same cv-qualification as, or greater cv-qualification than, cv1. A value of type pointer to object converted to “pointer to cv void” and back to the original pointer type will have its original value.

如果不可以,那么或者代码写错了,或者编译器不支持C++标准.

65,209

社区成员

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

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