[英]How to declare a self-referential container in C++?
對於C中的struct
的typedef
,我不能這樣做:
typedef struct {
unsigned id;
node_t *left;
node_t *right;
} node_t;
因為node_t
在定義之前是未知的,所以它不能在它自己的定義中使用。 有點像Catch-22。 但是,我可以使用此變通方法來創建所需的自引用類型:
typedef struct node_s node_t;
struct node_s {
unsigned id;
node_t *left;
node_t *right;
};
同樣,我想對引用自身的C ++容器做類似的事情:
typedef pair<unsigned, pair<node_t *, node_t * > > node_t;
但是當然,編譯器抱怨node_t
在定義node_t
之前從未聽說過node_t
,就像上面的struct typedef
。
那么有沒有像struct
一樣的解決方法? 還是一些更好的方法來做到這一點? (不,我不想使用void
指針。)
你可以這樣做:
struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > >
{};
在struct node_t
,編譯器知道名稱為node_t
的類型存在,類似於前向聲明。
該語言不支持typedef
的前向聲明。 因此,你不能使用:
typedef pair<unsigned, pair<node_t *, node_t * > > node_t;
您可以使用struct node_t {...};
來完成容器的概念struct node_t {...};
,我相信不需要詳細說明。
如果命名結構指針, 則可以自引用結構指針(即typedef struct <name> {...}
)。 我通常使用以下習語:
typedef struct _node_t { // "Temporary" name "_node_t"
unsigned id;
struct _node_t *left; // Have to use "struct _node_t"
struct _node_t *right;
} node_t; // "Final" name
這基本上適用於以前的實際代碼答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.