成员结构的前向声明

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;
;

【讨论】:

以上是关于成员结构的前向声明的主要内容,如果未能解决你的问题,请参考以下文章

C++ 类的前向声明的用法

如何在 CORBA IDL 中声明/使用对结构的前向引用?

C++ 中嵌套类型/类的前向声明

C++ 中的前向引用或声明

20210421-C++的前向声明

C++ 中 typedef 的前向声明