0

我正在尝试使用 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

4 回答 4

1

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

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

同样适用于 int*。

如果您需要在 then 之间进行转换,则可以进行 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();
于 2011-12-10T19:30:00.697 回答
1

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

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

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

继承会起作用。让类型继承自基类!

于 2011-12-10T19:30:45.223 回答
0

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

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

于 2011-12-10T19:29:45.270 回答
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_i是 a 的地址int

于 2011-12-11T23:04:44.520 回答