使用重新解释指向整数的指针

时间:2011-12-10 19:26:55

标签: c++ reinterpret-cast

我尝试使用reinterpret_cast

将指针强制转换为其他类型
class MyClassA
{
 int x;
 int y;
 public:
    MyClassA();
    ~MyClassA();
};

class MyClassB
{
 int x;
 int y;
 public:
    MyClassB();
    ~MyClassB();
};

例如,如果我将一个指向MyClassA的指针转换为MyClassB,那么使用reinterpret_cast这个转换会起作用吗?代码可移植性怎么样?

而且,正如我所说:

  

(5.2.10 / 4)指针可以显式转换为任何整数类型   大到足以容纳它。

这是否意味着任何指针,例如MyClassA*只能转换为int *指针?如果我正确的话?

4 个答案:

答案 0 :(得分:1)

关于这是否有效我不知道,这将取决于实现。

然而,标准不保证这会起作用(所以不要这样做),MyClassA和MyClassB是两种不兼容的类型,即使它们在结构上是相同的。

同样适用于int *。

如果您需要在那之间进行转换,那么您可以创建A到B赋值运算符

class MyClassA{
...

    operator=(const MyClassB& mcb)
    {
        this.x=mcb.x;
        this.y=mcb.y;
    }
};

如果您需要访问MyClassA中的整数元素。

//in MyClassA
int& getX(){ return x; }
const int& getX() const { return x; }

int& x=mca.getX();

答案 1 :(得分:1)

  

(5.2.10 / 4)指针可以显式转换为足以容纳它的任何整数类型。

这意味着int*int。指针不是整数类型。

投射不相关类型的指针是坏消息,不应该这样做。 可以工作,但不可移植。

继承虽然有效。让类型继承自基类!

答案 2 :(得分:0)

这并不意味着你可以施放不相关的类型。这意味着如果在你的平台上64bit整数足够大以包含指针值,你可以将指针转换为64位整数(例如)。

PS:我想提一下你所做的完全偏离了标准,但你可能会在许多平台/编译器上侥幸逃脱:)

答案 3 :(得分:0)

我对第一个问题的回答是肯定的。指针只是一个变量(整数),其值是另一个存储单元的地址。这就是为什么你能够做到以下几点。

(*(void(*)())0)(); /*Ref: Andrew Koenig C Traps and Pitfals*/

#define CARD_INTERFACE_ADDRESS 0x4801C
struct A * = new (CARD_INTERFACE_ADDRESS) struct A

MyClassA * ptr_a无法(逻辑上)转换为int* ptr_i,因为您所说的是变量ptr_a所拥有的地址是MyClassA的地址前者而后者则说ptr_iint的地址。