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

标签: c++ class struct


【解决方案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;
};

【讨论】:

    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-06
    • 1970-01-01
    • 2017-04-05
    • 2016-07-14
    • 1970-01-01
    相关资源
    最近更新 更多