我想知道是否可以在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 ++的情况下是否存在涉及类型转换的危险?
如果这是一个问题,那么如何使用指向其成员变量的指针获取指向对象的指针?
谢谢
答案 0 :(得分:3)
为了能够直接使用类指针来获取指向其成员的指针,您必须确保该类是POD类型。否则可能会有隐藏的成员(如vtable)或填充,这会破坏任何努力。
要知道你应该尝试使用std::is_pod<Foo>
这是一个便利特质类,它会告诉你这个类是否有标准布局。
在任何情况下,听起来你应该避免这种方法,因为它似乎本质上是不安全的。为什么不能只将指针传递给成员变量?例如:
Foo myFoo;
cllabackFunction(&(myFoo.x));
答案 1 :(得分:1)
这并不是我真正想做的事情。尽管如此,
有offsetof (type,member)
宏,它返回结构中字段的字节偏移量。您可以使用它来获取对象的基址(来自其中一个成员的地址 - 如果您知道哪个成员)并将该地址强制转换为正确的类型。
当然,它不能保证适用于非PODS,虽然不保证并不意味着它不会工作,你的不可移植和可能未定义的行为不是你吗?