-1

ここに、二重連結リストを実装するために使用できる単純なノード構造体があります。

template <class T>
struct node {

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

ノードオブジェクト/インスタンスを知らない、または参照していないと仮定しますが、そのデータメンバーへのポインターは持っています。T データ;

データメンバーへのポインターからホストノードオブジェクトを参照/検索するにはどうすればよいですか?

4

1 に答える 1

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 以降でのみ有効です。

于 2015-02-08T13:23:41.567 に答える