繁体   English   中英

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

[英]Typecasting Member Variable Pointer to Object Pointer

我想知道是否在C ++中将成员变量类型转换为对象指针吗?

我的课如下-

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

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

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

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 ++,是否有涉及这种类型转换的危险?

如果有问题,那么如何使用指向其成员变量的指针来获得指向对象的指针?

谢谢

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

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

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

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

作为您真正想做的事情,这并没有完全打动我。 仍然,

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

当然,不能保证它不能用于非PODS,尽管不能保证并不意味着它不能工作,但是可以移植和可能不确定的行为是吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM