Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将指向未知实例(但已知类)的已知成员的指针转换为所属实例_C++_Pointers_Pointer To Member - Fatal编程技术网

C++ 将指向未知实例(但已知类)的已知成员的指针转换为所属实例

C++ 将指向未知实例(但已知类)的已知成员的指针转换为所属实例,c++,pointers,pointer-to-member,C++,Pointers,Pointer To Member,给定一个指向对象已知成员的指针,如何获取指向封闭对象的指针 有没有比下面更好的方法?它甚至有效吗 struct数据{ INTA,b; }; 数据虚拟; 静态常量std::ptrdiff\u t offs\u a=重新解释投射(dummy.a)-重新解释投射(dummy); void main(){ 数据d; int*v=&(d.a.); 数据*所有者=重新解释铸件(重新解释铸件(v)-关闭铸件a); 所有者->b=1; } 特别是,我不喜欢使用虚拟对象dummy来确定指针偏移量。 是否有一种直

给定一个指向对象已知成员的指针,如何获取指向封闭对象的指针

有没有比下面更好的方法?它甚至有效吗

struct数据{
INTA,b;
};
数据虚拟;
静态常量std::ptrdiff\u t offs\u a=重新解释投射(dummy.a)-重新解释投射(dummy);
void main(){
数据d;
int*v=&(d.a.);
数据*所有者=重新解释铸件(重新解释铸件(v)-关闭铸件a);
所有者->b=1;
}
特别是,我不喜欢使用虚拟对象
dummy
来确定指针偏移量。
是否有一种直接强制转换的方法,可以使用指向成员的指针来指定哪个(已知)成员
v
指向?

您可以使用
offsetof

引述:

offsetof
扩展为类型为
std::size_t
的整型常量表达式,其值是从指定类型的对象开始到其指定成员的偏移量(以字节为单位),包括填充(如果有)

它只保证为您工作,但对于您的情况,它应该是好的

编辑:原始代码可以这样编写:

data d;
int *v = &(d.a);
data *owner = reinterpret_cast<data *>(reinterpret_cast<char *>(v) - offsetof(data, a));
owner->b = 1;
datad;
int*v=&(d.a.);
数据*所有者=重新解释铸件(重新解释铸件(v)-偏移量(数据,a));
所有者->b=1;

您可以使用
宏的偏移量

引述:

offsetof
扩展为类型为
std::size_t
的整型常量表达式,其值是从指定类型的对象开始到其指定成员的偏移量(以字节为单位),包括填充(如果有)

它只保证为您工作,但对于您的情况,它应该是好的

编辑:原始代码可以这样编写:

data d;
int *v = &(d.a);
data *owner = reinterpret_cast<data *>(reinterpret_cast<char *>(v) - offsetof(data, a));
owner->b = 1;
datad;
int*v=&(d.a.);
数据*所有者=重新解释铸件(重新解释铸件(v)-偏移量(数据,a));
所有者->b=1;

你很快就能得到你的答案,但我想指出的是,在 Value*/Cuth>上的指针算法是由C++标准定义的。您需要使用
char*
unsigned char*
std::byte*
。感谢您指出这一点一般来说,你不能。对于某些受限类型(本质上是编译为C的东西),您可以这样做。@PeteBecker:为什么?我会假设每个具体类型都有固定的内存布局?我能想象不确定布局的唯一例子是虚拟继承(如果有的话)。。。还有其他的吗?@burnpanck——指针算法不需要工作。指针算法仅适用于同一数组中的对象。这就是为什么C有<代码> >偏移量> /Cave>宏——让执行者知道如何计算。你肯定会很快得到答案,但我只是想指出,在 Value*/Cuth>上的指针算法是由C++标准定义的。您需要使用
char*
unsigned char*
std::byte*
。感谢您指出这一点一般来说,你不能。对于某些受限类型(本质上是编译为C的东西),您可以这样做。@PeteBecker:为什么?我会假设每个具体类型都有固定的内存布局?我能想象不确定布局的唯一例子是虚拟继承(如果有的话)。。。还有其他的吗?@burnpanck——指针算法不需要工作。指针算法仅适用于同一数组中的对象。这就是为什么C有
offsetof
宏——让实现者弄清楚如何计算它。注意
offsetof
只给出从对象开始到内存的偏移量。它不提供指向该对象的指针。(注意:自C++17以来,允许实现支持更多类型,但这当然是不可移植的:)注意
offset of
只提供从对象开始到内存的偏移量。它不会给您指向该对象的指针。(注意:自C++17以来,允许实现支持更多类型,但这当然不是可移植的:)