2009-12-03 3 views
19

그래서 나는 어떤 클래스 B 함수를 호출하고자하는 클래스 A를 가지고있다. 그래서 "b.h"를 포함합니다. 그러나 클래스 B에서는 클래스 A 함수를 호출하려고합니다. "a.h"를 포함하면 무한 루프가됩니다. 그것에 대해 무엇을 할 수 있습니까?두 클래스가 C++을 사용하여 서로를 볼 수 있습니까?

답변

26

각 클래스 (A와 B)에는 헤더 파일과 구현 파일이 있어야합니다.

각 헤더 파일 (예를 들어 A.h) 다른 헤더 파일을 포함 할 수 없습니다 (예 : B.h)하지만 (예를 들어 class B; 같은 문) 다른 클래스에 대한 전방 참조를 포함 할 수 있으며, 다음에 포인터 및/또는 참조를 사용할 수 있습니다 그 선언의 다른 클래스 (예 : class A)는 데이터 멤버 및/또는 메소드 매개 변수로 B*을 포함 할 수 있습니다.

각 CPP 파일 (예 : A.cpp)은 두 개 이상의 헤더 파일 (예 : A.hB.h)을 포함 할 수 있습니다. 각 CPP 파일에는 자체 헤더 파일이 먼저 포함되어야합니다 (예 : A.cppA.h이 포함되어야하고 B.h이 포함되어야합니다). B.cpp에는 B.h, 그 다음에 A.h이 포함되어야합니다.

각 헤더 파일에는 클래스의 정의가 아닌 선언 만 포함해야합니다. 예를 들어 클래스의 메소드의 서명은 나열되지만 메소드의 본문/구현은 나열되지 않습니다 (메소드 본문/구현은 헤더 파일에없는 .cpp 파일). 헤더 파일에는 구현 세부 사항이 포함되어 있지 않으므로 다른 클래스의 세부 정보를 참조하지 않아도됩니다. 많아야 그들은 예를 들어, B이 클래스의 이름임을 알아야합니다. 즉, 헤더 파일을 다른 헤더 파일에 포함하는 대신 전달 선언문에서 가져올 수 있습니다.

35

헤더 (.h) 파일에 멤버 함수 선언 만 넣고 멤버 함수 정의는 구현 파일 (.cpp)에 넣습니다. 그런 다음 헤더 파일은 서로를 포함 할 필요가 없으며 두 구현 파일 중 하나에 헤더를 모두 포함 할 수 있습니다. , 이것은 당신이 포인터와 참조 유형 (A*A&)를 사용할 수 있습니다

class A; 

아니지만 :

경우에

당신은뿐만 아니라 회원 서명에 다른 클래스를 참조 할 필요가, 당신은 앞으로 선언을 사용할 수 있습니다 A 그 자체. 또한 회원에게 전화를 걸지도 않습니다.

예 :

// a.h 
struct B; // forward declaration 

struct A { 
    void foo(B* b); // pointers and references to forward-declared classes are ok 
}; 


// b.h 
struct A; // forward declaration 

struct B { 
    void bar(A& a); // pointers and references to forward-declared classes are ok 
}; 


// a.cpp 
#include "a.h" 
#include "b.h" 

void A::foo(B* b) { 
    b->bar(*this); // full declaration of B visible, ok to call members now 
} 


// b.cpp 
#include "a.h" 
#include "b.h" 

void B::bar(A& a) { 
    a.foo(this); // full declaration of A visible, ok to call members now 
} 
-7

, #define#endif을 .h 파일에 넣으십시오.

+1

이 게시물은 질문에 대답하지 않습니다. –

관련 문제