首页 > 解决方案 > 我可以在 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++pointers

解决方案


我可以在 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 扩展。


推荐阅读