c++ - 我可以在 C++ 中获取具有成员变量地址的对象的引用吗?
问题描述
如果我只有该对象的成员变量的地址,是否可以获得对该对象的引用?
class example{
public:
int var;
};
int main(){
example exampleObject;
int* point=&exampleObject.var;
example* objPointer; // can i get objPointer to point to exampleObject only using point
return 1;
}
解决方案
我可以在 C++ 中获取具有变量地址的对象的引用吗?
根据示例代码,此问题中似乎缺少一个关键词。看来您希望使用该对象的成员变量的地址而不是类类型的变量来引用该对象。
可能是的,但有一些限制。
只有当所讨论的类是标准布局类时,这才有可能。在这种情况下,您可以将指向第一个成员的指针重新解释为指向类本身的指针。然后可以通过指针间接获取引用:
static_assert(std::is_standard_layout_v<example>);
example* objPointer = reinterpret_cast<example*>(point);
assert(objPointer == &exampleObject); // guaranteed to pass
使用宏可以获得基于除第一个成员之外的成员的标准布局类的指针offsetof
,尽管我所看到的实现该想法的所有尝试都依赖于技术上未定义的行为,或者至少是实现定义的东西。
这是来自 Linux 内核的实现(不是用 C++ 编写的,而是用 C 编写的,在允许的范围内可能更宽松):
#define container_of(ptr, type, member) ({ \ const typeof(((type *)0)->member) * __mptr = (ptr); \ (type *)((char *)__mptr - offsetof(type, member)); })
typeof
不在标准 C++ 中,甚至不在标准 C 中,而是 GNU 语言扩展。这也使用了一个语句表达式(不要与表达式语句混淆),这是另一个 GNU 扩展。
推荐阅读
- reactjs - 如何防止标签导航专注于自定义 React 组件?
- gluon-mobile - gluon 移动 android 应用程序默认语言环境是 en_US 但手机是西班牙语
- firebase - 显示当前位置和半径的信息
- reactjs - 自定义 React 钩子:卸载组件后保持值的一种方法?
- node.js - 错误:在 Heroku 上部署时无法读取未定义的属性“0”
- linux - libvrtd:在虚拟机上使用 macvtap 时主机接口获取 IP
- android - 在Android上存在多个(例如两个接近传感器)时区分相同类型的传感器
- google-colaboratory - AttributeError:“numpy.ndarray”对象没有属性“渐变”
- javascript - 如何编写一个返回前 5 个正偶数的函数?
- python - pyenv virtualenv中的gdb python