[英]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.