2013-02-20 5 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; 
}; 

것은 당신이 볼 수 있듯이 , 나는 앞으로 Expression.h Parameter.h 선언하지만 다음과 같은 두 가지 오류가 계속 발생합니다 :

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! 
} 

당신이 할 수있는 것은 헤더에서와 .cpp 파일로 Parameter() 생성자의 구현을 이동합니다.

+0

그것은 일 (새 경우 지금 당신은/생성자는 던져 안전하다)! 감사. – amorimluc

4

매개 변수 생성자를 cpp 파일에 넣어야합니다. 생성자에서 expr = new 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()) 
{ 
} 

보조 노트 : 스마트 포인터 대신 원시 포인터 클래스 멤버로 사용할 수? 변수 이름 stringstd::string에 영향을 줄 수 있습니다.

2

별도의 cpp 파일에서 생성자의 본문을 정의하십시오. 클래스의 forward 선언문을 사용하면 "other"클래스의 생성자에서 사용하는 것처럼 포인터 또는 참조를 사용할 수 있습니다 (forward 선언 클래스의 생성자가 아닙니다). 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()) 
{ }