본문 바로가기

Application-level프로그래밍

(C)circular dependency,error: forward declaration

(조사중)

코딩의 순서상 아직되지 않은 정의 되지 않은 타입을 가지고, 그의 멤버들을 쓸 수는 없다.
어떤 구조체나 클래스의 멤버를 쓰려면 그 구조체 등이 앞서 미리 정의가 되고,그것을 컴파일러가 오류없이 인식해야한다.

쓰이는 클래스가 먼저 정의 되어야한다.
그러나 서로 상대방 클래스를 쓰는 관계라면 어떻게 해결하는가?

한 가지 방법으로, 적어도 쓰임에 있어 일방적인 관계가 되도록 구조를 바꿔주는 것이 있다.
이렇게하면 대개는 forward declaration 이 필요없다.


그러나, forawrd declaration이 쓰이는 예는
-하나,
아직 정의되지 않은 클래스의 존재를 선언하여, 그 forward declaration(선언) 뒤에 나오는 클래스들에서 이 선언된 클래스 자체의 포인터 타입을 이용에 정의 및 선언하는 것을 허용한다. (forward declaration 된 클래스의 멤버를 사용할 수 있게 해주지는 못한다는 것을 명심)
-둘,
소스파일에서 필요한 클래스들을 참조하기 위해 #include 를 했지만,
헤더파일에서는 그들 클래스의 이름이 정의 및 선언을 위해 언급된 경우. 이경우는 헤더파일에서도 #include를 하는 대신 forward declaration을 써준다. (이경우 에는 헤더에서 include 하는 대신 소스에서는 해당 클래스의 정의를 include 안해도 동작할 것으로 보인다. 즉, 꼭 저렇게 할 필요는 없을 듯)