【发布时间】: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文件中,您还必须在其中包含适当的头文件。