成员结构

时间:2016-10-20 04:11:58

标签: c++ class struct

我想编写这样的代码,但它不起作用:

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

如果无法做到这一点,解决冲突的方法是什么?

1 个答案:

答案 0 :(得分:0)

您必须推迟nom的定义,直到named!(record<Record>, chain! ( latch: le_u32 ~ total_energy: le_f32 ~ x_cm: le_f32 ~ y_cm: le_f32 ~ x_cos: le_f32 ~ y_cos: le_f32 ~ weight: le_f32 , { Record { latch: latch, total_energy: total_energy, x_cm: x_cm, y_cm: y_cm, x_cos: x_cos, y_cos: y_cos, weight: weight, } } ) ); 为完整类型:

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