类型转换成对象指针的成员变量指针

时间:2013-12-31 17:09:20

标签: c++ casting

我想知道是否可以在C ++中将成员变量强制转换为对象指针?

我有一个课程如下 -

class Foo
{
private:
    int x;
    int y;
    int z;

public
    void func1(...);
    void func2(...);
    void func3(...);
}

此外,我还有第三方代码,其回调为 -

void callbackFunction (int *xPointer)
{
     // This is what I want to do
     Foo * fooPtr = (Foo*)xPointer;
     if(fooPtr->y == fooPtr->z)
     {
          //... do something
     }
}

在此代码中,xPointer变量指向我的类对象的int x。 现在,我想知道我可以某种方式将xPointer强加给Foo *。在C中,我将指向struct指针的指针转换为访问其他成员,没有任何问题。

在C ++的情况下是否存在涉及类型转换的危险?

如果这是一个问题,那么如何使用指向其成员变量的指针获取指向对象的指针?

谢谢

2 个答案:

答案 0 :(得分:3)

为了能够直接使用类指针来获取指向其成员的指针,您必须确保该类是POD类型。否则可能会有隐藏的成员(如vtable)或填充,这会破坏任何努力。

要知道你应该尝试使用std::is_pod<Foo>这是一个便利特质类,它会告诉你这个类是否有标准布局。

在任何情况下,听起来你应该避免这种方法,因为它似乎本质上是不安全的。为什么不能只将指针传递给成员变量?例如:

Foo myFoo;
cllabackFunction(&(myFoo.x));

答案 1 :(得分:1)

这并不是我真正想做的事情。尽管如此,

offsetof (type,member)宏,它返回结构中字段的字节偏移量。您可以使用它来获取对象的基址(来自其中一个成员的地址 - 如果您知道哪个成员)并将该地址强制转换为正确的类型。

当然,它不能保证适用于非PODS,虽然不保证并不意味着它不会工作,你的不可移植和可能未定义的行为不是你吗?