读书人

指针类型转换难题,该如何处理

发布时间: 2012-02-04 15:43:08 作者: rapoo

指针类型转换,难题

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

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

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

大家还有什么招数能做指针类型的转换吗?static_cast不能用于指针转换,VS2003编译不通过

[解决办法]
谁知道你公司还有什么不允许的啊,看看这样行不行

C/C++ code
CDMClass* b = dynamic_case<CDMClass*>a
[解决办法]
楼主试试看这段代码能在VS2003下编译通过不,我没有那个环境
C/C++ code
#include <iostream>using namespace std;class Test{public:    Test(){}};int main(){    Test* t;    void* pv = new Test;    t = static_cast<Test*> (pv);        return 0;}
[解决办法]
我个人觉得还是应该用 static_cast,可能楼主在某处疏忽了,所以.NET 才拒绝编译的,这种标准中显示定义的东西,它应该会支持的啊。


[解决办法]
公司还真麻烦,用C风格的也不是不好啊.看着也蛮好看的啊.
[解决办法]
static_cast不能用于指针转换,VS2003编译不通过
---------
你使用有问题吧?

CDMClass* pCDM = new CDMClass;
void* a = static_cast<CDMClass*>(pCDM);
[解决办法]
不能用c语言风格cast
不允许使用reinterpret_cast
这两条已经足够限制你 不能用void*
你可以试试看用boost::any
[解决办法]
不能用c语言风格cast
不允许使用reinterpret_cast
...

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

如果不可以使用,
那么,就无法使用 void * 操作了,
修改传递时候的类型为目标类型,或者是可以隐式转换到目标类型的某个类型。
[解决办法]
倒是可以使用这种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;
}
[解决办法]
试试把void*
换成

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

吧,如果static_cast不行的话
[解决办法]
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++标准.

读书人网 >C++

热点推荐