成员结构的前向声明
Posted
技术标签:
【中文标题】成员结构的前向声明【英文标题】:Forward declaration of member struct 【发布时间】:2016-10-20 04:11:58 【问题描述】:我想写这样的代码,但是不行:
struct ast;
struct parser;
struct parser
struct node
node *parent;
;
ast build_ast() //here we want to use object of ast tyoe
node *ret = new node;
return ast(ret);
;
struct ast
parser::node *root; //here we try to access member struct of y
ast(parser::node *rt):root(rt)
;
问题是我试图在解析器中创建一个不完整类型的对象。如果我交换结构的实现,问题是我尝试访问不完整类型的成员结构。显然,我可以通过使节点成为一个独立的结构来解决这个问题,但这似乎很糟糕,因为我可能希望在我的程序中有其他节点类型。 问题是:我可以在解析器结构之外以某种方式对节点结构进行前向声明吗?例如:
struct ast;
struct parser;
struct parser::node; //making a forward declaration of member struct
如果无法做到这一点,有什么方法可以解决冲突?
【问题讨论】:
你从不转发声明node
。
只需在struct中声明ast build_ast()函数,稍后在struct ast之后定义。
将类的声明和定义放在各自的头文件中,并将成员函数的实现放在.cpp
文件中,您还必须在其中包含适当的头文件。
【参考方案1】:
你必须推迟 build_ast
的定义直到 ast
是一个完整的类型:
inline ast build_ast(); //here we want to use object of ast type
inline
是为了使此声明在功能上与您在示例中的相同。您可能想要删除它并将build_ast
移动到实现文件
结构定义之外:
ast parser::build_ast()
node *ret = new node;
return ast(ret);
要转发声明node
,您需要在parser
定义中执行此操作。换句话说,你不能在不定义外部的情况下前向声明内部类。
struct parser
struct node;
// ...
;
然后您可以继续定义:
struct parser::node
node *parent;
;
【讨论】:
以上是关于成员结构的前向声明的主要内容,如果未能解决你的问题,请参考以下文章