[英]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.