2011-09-10 7 views
-1

내가이 두 클래스를 말해봐 그들의 방법은 b 클래스와 그 반대로?순환 종속성

+3

에 StackOverflow의 유령은 말한다, "* Uhhhhhhnnnn ... Neeeeed moooore cooooode ...... *" –

+2

내가 거기에 어떤 클래스를 볼 수 없습니다, 그래서 downvoting 해요. –

답변

2

이 같은 선언을 앞으로 사용할 수 있습니다 자세한 내용은 this SO 질문을 참조

class B; 

class A 
{ 
    B* ThisIsValid; 
} 

class B 
{ 
    A SoIsThis; 
} 

.

전 처리기 #include s에 대해 코드를 구성하는 더 좋은 방법이 있습니다. 전체 기사가 없으면 말하기 어렵습니다.

+1

가장 단순한 모델이 헤더 파일에서이를 선언 한 곳을 보았습니다. – Joshua

0

"전달 선언"을 사용할 수 있습니다.

함수의 경우이 값은 void myFunction(int);입니다. 변수의 경우 extern int myVariable;처럼 보일 수 있습니다. 클래스의 경우 class MyClass;. 이러한 bodiless 문은 실제 코드가 포함 된 선언 앞에 포함될 수 있으며 선언 된 형식을 사용하는 코드를 생성하는 데 충분한 정보를 컴파일러에 제공 할 수 있습니다.

순환 포함에 대한 문제를 방지하려면 각 헤더 파일의 맨 위에 #ifdef 인 "포함 가드"를 사용하여 두 번 포함되지 않도록하십시오.

+0

이 답변은 A의 헤더에서'B '에 대한 당신의 언급을 선언 가능한 것들에 전달하도록 제한한다는 것을 의미하지만,'A'의 소스 파일에서 여러분은 자유로울 수 있습니다 '#include'는 완전한 정의를 포함합니다. 왜냐하면 소스 파일을'#include '할 것이 없으므로 순환 의존성을 가지지 않을 것이기 때문입니다. 이것은 헤더에 영향을 미칠 뿐이므로 형식을 효과적으로 사용하지 못하는 방식을 사용할 수 있습니다. –

0

"other"클래스는 "first"클래스에 대한 참조 또는 포인터 만 가질 수 있습니다. 파일 아에

:

#include "b.h" 

struct a { 
    b m_b; 
}; 

파일 BH의 :

#include "b.h" 
#include "a.h" 

void using_the_a_instance(b& theb) 
{ 
    theb.m_a = new a(); 
} 
1

이 @Borealid의 대답에 확장하려면 :

struct a; 

struct b { 
    a* m_a; 
}; 

void using_the_a_instance(b& theb); 

파일 b.cpp에서

순환 포함에 문제가 발생하지 않도록하려면 "포함 가드"를 사용하십시오.

예 :

#ifndef MYFILE_H /* If this is not defined yet, it must be the first time 
we include this file */ 
#define MYFILE_H // Mark this file as already included 
// This only works if the symbol we are defining is unique. 

// code goes here 

#endif 
관련 문제