[완료] c++ 클래스를 분리해서 정의하고 구현할 때 궁금한 점이 있습니다.
안녕하세요.
C++ 소스를 분석하다가 궁금한 점이 생겨서 글을 올립니다.
소스파일들을 보는데 대부분 다음과 같이 CFooB 클래스에 대한 헤더파일을 정의부가 아닌 구현부에서
직접 include 시키더라구요..
=================================================================================
[CFooA.h]
class CFooB; // CFooB 클래스를 선언만 해 둠.
class CFooA
{
CFooB obj;
}
=================================================================================
[CFooA.cpp]
#include "CFooA.h"
#include "[CFooB 가 정의된 헤더 파일]"
class CFooA
{
CFooB obj;
}
=================================================================================
CFooA.h 파일에서 CFooB 클래스를 선언만 해 준 이유가 컴파일 에러를 방지하기 위한 것은 알겠지만.
근데 왜 굳이 'CFooB 가 정의된 헤더 파일'을 구현부 쪽에서 인클루드 시키는 걸까요?
제 생각에는 차라리 CFooB를 사용할 것이라면 애초에 CFooA.h 에서 인클루드 시키는게 나을거 같은데;;...
이런걸 무척 자주 발견해서 궁금해졌습니다..;; 혹시 코드를 이렇게 작성하는 이유가 있는건가요?
궁금합니다 ^^;
참고로 위 코드는
참고로 위 코드는 컴파일되지 않습니다.
전방선언을 이용할수 있는 건 포인터나 레퍼런스로 선언할때 입니다.
해더파일에서 다른 해더파일을 포함하는 것을 피하는 이유는 컴파일시의 의존성을 줄이기 위해서입니다.
class A의 선언이 a.h에 있고, class B(b.h, b.cpp)에서 class A를 이용하고 있고, class C(c.h, c.cpp)에서 class B를 이용하는 경우를 생각해보면, c.h던 c.cpp던 어느쪽인가에선 b.h를 포함해야 합니다. 마찬가지로 b.h혹은 b.cpp에서는 a.h를 포함해야 합니다.
1. b.h에서 a.h를 포함하는 경우
이경우 a.h가 수정되면, b.cpp도 물론 재컴파일되야 하지만, c.cpp class A를 직접 이용하던 안하던 상관없이, b.h를 통해서 a.h의 내용을 포함하고 있기 때문에 재컴파일되야 합니다.
2. b.cpp에서 a.h를 포함하는 경우
이경우 a.h가 수정되더라도, c.cpp에서 class B의 멤버인 class A의 객체를 이용하지 않는 한, a.h를 포함하지 않기 때문에 재컴파일해야하는 것은 b.cpp만입니다.
파일이 세개인 경우는 파일 한개 더 컴파일 하는 것으로 해결되지만, 대규모 프로젝트에서 컴파일의존성이 많은 경우 시간상 많은 손실이 발생하게 됩니다.
참으로 명쾌한 답변입니다 :)
아 그랬군요~ xylosper님 정말 감사합니다. *^^*
저런 방식을 전방선언이라고 부른다는 것도 처음 알았습니다.
게다가 궁금했던 점도 속시원히 해결했네요.
다시한번 정말 감사합니다.
댓글 달기