2013-02-20 125 views
4

週期性包含問題C++錯誤:正向聲明'struct ...?

我向前聲明中的其他的報頭中的一個類,試圖解決他們的週期性列入。這裏是我的兩個文件:

的第一個文件(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,但是我仍然收到以下兩個錯誤:

forward declaration of 'struct Expression'

invalid use of incomplete type 'struct Expression'

我看了幾個以前發佈的問題,但仍然無法解決這個問題。謝謝。

回答

9

不能向前聲明Expression因爲你需要爲這個完全聲明:

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

你可以做的是移動Parameter()構造函數的實現了頭和成.cpp文件。

+0

它的工作!謝謝。 – amorimluc 2013-02-20 23:43:22

4

當需要在構造函數中調用expr = new Expression();時,需要將Parameter構造函數放入cpp文件中。

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

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()) 
{ } 

(你現在是否有新的安全/構造扔)