首页 文章

C错误:'struct ...的前向声明?

提问于
浏览
4

cyclical inclusion problem

我转发声明另一个 Headers 中的一个类,试图解决它们的周期性包含 . 这是我的两个文件:

第一个文件(Parameter.h):

#pragma once
#include "Token.h"`

class Expression;

class Parameter {
public:

    Parameter() {
        string = new Token();
        identifier = new Token();
        expr = new Expression();
    }

    Token* string;
    Token* identifier;
    Expression* expr;
};

第二个文件(Expression.h):

#pragma once
#include "Token.h"
#include "Parameter.h"

class Expression {
public:
    Expression() {
        param1 = new Parameter();
        param2 = new Parameter();
        op = new Token();
    }

    Expression(Parameter* p1, Token* o, Parameter* p2) {
        param1 = p1;
        param2 = p2;
        op = o;
    }

    Parameter* param1;
    Parameter* param2;
    Token* op;
};

如您所见,我在Parameter.h中转发声明Expression,但我仍然遇到以下两个错误:

'struct Expression'的前向声明无效使用不完整类型'struct Expression'

我看了几个以前发过的问题,但仍然无法解决这个问题 . 谢谢 .

3 回答

  • 2

    你不能转发声明 Expression 因为你需要完整的声明:

    Parameter() {
        string = new Token();
        identifier = new Token();
        expr = new Expression();  // here!
    }
    

    你可以做的是将 Parameter() 构造函数的实现移出 Headers 并进入 .cpp 文件 .

  • 9

    您需要将参数构造函数放在cpp文件中,当您在构造函数中调用 expr = new Expression(); 时,需要知道Expression具体类型 .

    Parameter.h

    #pragma once
    #include "Token.h"
    
    class Expression;
    
    class Parameter {
    public:
    
        Parameter();
    
        Token* token;
        Token* identifier;
        Expression* expr;
    };
    

    Parameter.cpp

    #include "Parameter.h"
    
    Parameter::Parameter()
    : token(new Token()),
      identifier(new Token()),
      expr(new Expression())
    {
    }
    

    旁注:可以使用智能指针代替原始指针作为类成员吗?变量名 string 也可能会影响 std::string .

  • 4

    在单独的cpp文件中定义构造函数的主体 . 类的前向声明允许您使用指针或引用,而不是前向声明类的构造函数,因为您在“其他”类的构造函数中使用 . 在ccp文件中:

    #include "Parameter.h"
    #include "Expression.h"   //   ??
    
    Parameter::Parameter():   string (new Token()),
                              identifier(new Token()),
                              expr ( new Expression())
    {}
    
    
    Expression::Expression() param1 (new Parameter()),
                             param2 (new Parameter()),
                             op ( new Token())
    {    }
    

    (现在如果新的/构造函数抛出你是安全的)

相关问题