4

周期性包容问题

我转发在另一个类的标题中声明其中一个类,以尝试解决它们的循环包含问题。这是我的两个文件:

第一个文件(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,但仍然收到以下两个错误:

“结构表达式”的前向声明

不完整类型“结构表达式”的无效使用

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

4

3 回答 3

9

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

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

您可以做的是将Parameter()构造函数的实现移出标题并放入.cpp文件中。

于 2013-02-20T22:57:13.030 回答
4

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

参数.h

#pragma once
#include "Token.h"

class Expression;

class Parameter {
public:

    Parameter();

    Token* token;
    Token* identifier;
    Expression* expr;
};

参数.cpp

#include "Parameter.h"

Parameter::Parameter()
: token(new Token()),
  identifier(new Token()),
  expr(new Expression())
{
}

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

于 2013-02-20T22:57:21.563 回答
2

在单独的 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())
{    }

(现在如果 new/constructors 抛出你是安全的)

于 2013-02-20T22:58:12.437 回答