簡體   English   中英

如何在C ++中聲明自引用容器?

[英]How to declare a self-referential container in C++?

對於C中的structtypedef ,我不能這樣做:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM