【问题标题】:C++: How to find host object from pointer to member variableC++:如何从指向成员变量的指针中找到宿主对象
【发布时间】:2015-02-08 12:52:22
【问题描述】:

这里我们有一个简单的节点结构,可能用于实现双链表。

template <class T>
struct node {

    node<T> *prev = NULL;
    node<T> *next = NULL;
    T data;
};

假设我们不知道或没有对节点对象/实例的引用,但我们确实有一个指向它的 data 成员的指针。 T数据;

如何从指向它的 data 成员的指针中引用/找到主机节点对象?

【问题讨论】:

  • 你不能便携。您可能会找到一种方法来破解offsetof 宏和reinterpret_cast&lt;&gt; 处理char *node * 之间的所有内容,但这在技术上是未定义的行为。如果您需要表达双向关系,则使用从每个子节点到其父节点的反向指针。
  • 您在问如何找到列表中的headT* data; BTW 看起来很奇怪。
  • 你真的有指向成员的指针 (pointer == &amp;node.data) 还是你有存储在该成员中的指针 (pointer == node.data)?如果是后者,则找不到。
  • 抱歉,已编辑!它应该是:T 数据不是:T* 数据

标签: c++ pointers member host-object


【解决方案1】:

详述 StenSoft 评论,如果你只知道data 成员的,你将无法获得包含它的结构体。

但是如果你知道它的地址,说T** member_addr可以找到node

void * ma = static_cast<void *>(member_addr); // convert pointer to void * : legal
intptr_t ima = static_cast<intptr_t>(ma); // convert void * to intptr_t : legal
intptr_t ina = ima - offsetof(struct node, data); // legal by definition of offestof
void * na = static_cast<void *>(ina); // convert intptr_t to void * : legal
struct node *pn = static_cast<node *>(na); // convert void * to pointer : legal provided the initial void * pointer points to a correct object

当然,所有这些都只适用于 C++11 或更高版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2016-02-25
    • 2021-12-22
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多