DEV/C++
순환 종속(Circular Dependency) 와 전방 선언(Forward Declaration)
retire
2025. 2. 26. 17:40
AClass 와 BClass 가 있고
AClass에는 BClass* 를 선언부(.h)에 선언하여 전역변수로 사용 하고
BClass에서는 AClass 의 함수를 호출 한다
라는 구성으로 되어있다고 하자.
그럼
#pragma once
#include "BClass.h" // BClass를 직접 포함
class AClass {
public:
BClass* b; // BClass의 포인터 사용
};
[AClass.h]
#pragma once
#include "AClass.h" // AClass를 직접 포함
class BClass {
public:
void someFunction(AClass* a); // AClass의 함수 호출
};
[BClass.h]
와 같이 구현되면 순환 종속(Circular Dependency) 오류가 발생한다.
이는 AClass 와 BClass 모두 서로를 참조하려 하기 때문에
클래스 정의가 완전히 처리되지 않은 상태에서 포함되기 때문에 컴파일 에러가 발생한다.
이 경우 빌드 시 AClass.h 에서 BClass 를 찾을 수 없다는 C2143, C4430, C2238 와 같은 오류 확인 된다.
이를 해결하기 위해선 전방 선언(Forward Declaration) 이 필요하다.
이는 #include BClass.h 와 같은 참조가 아닌 class BClass; 와 같은 선언으로 구현된다.
#pragma once
class BClass; // 🔹 BClass의 구체적인 구현 없이 포인터로만 참조 가능
class AClass {
public:
BClass* b; // ✅ 포인터 사용은 전방 선언으로 해결 가능
};
[AClass.h]
AClass의 선언부(.h)에는 전방 선언만 하여 BClass의 전체 구현을 참조하지 않고 형태만 사용한다.
#include "AClass.h"
#include "BClass.h" // ✅ 여기서 include (BClass의 구현 필요)
[AClass.cpp]
AClass의 구현부(.cpp)에서 BClass를 직접 사용하기 위해 BClass.h 를 include 를 사용하여 참조한다.
이럴경우 순환 종속 없이 정상적으로 동작 한다.
이 떄, BClass 입장에선 AClass* 를 직접 사용해야 하기 때문에 선언부에 #include "AClass.h" 를 유지시킨다.