繁体   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