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

时间:2015-12-30 07:38:39

标签: c++ containers typedef self-reference

对于C中typedef的{​​{1}},我无法执行此操作:

struct

因为typedef struct { unsigned id; node_t *left; node_t *right; } node_t; 在定义之前是未知的,所以它不能在自己的定义中使用。有点像Catch-22。但是,我可以使用此变通方法来创建所需的自引用类型:

node_t

同样,我想对引用自身的C ++容器做类似的事情:

typedef struct node_s node_t;
struct node_s {
    unsigned id;
    node_t *left;
    node_t *right;
};

但当然,编译器抱怨它在定义typedef pair<unsigned, pair<node_t *, node_t * > > node_t; 之前从未听说过node_t,就像上面的node_t一样。< / p>

那么有struct typedef的解决方法吗?还是一些更好的方法来做到这一点? (不,我不想使用struct指针。)

3 个答案:

答案 0 :(得分:10)

你可以这样做:

struct node_t : std::pair<unsigned, std::pair<node_t *, node_t * > >
{};

struct node_t之后,编译器知道名称为node_t的类型存在,类似于前向声明。

答案 1 :(得分:4)

该语言不支持Holder.holder.value == 0的前向声明。因此,你不能使用:

typedef

您可以使用typedef pair<unsigned, pair<node_t *, node_t * > > node_t; 来完成容器的概念,我确信无需详细说明。

答案 2 :(得分:0)

您可以自引用结构指针(如果您为其命名)(即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

这基本上将先前的答案应用于实际代码。