기본 썸네일 이미지

순환 종속(Circular Dependency) 와 전방 선언(Forward Declaration)

2025. 2. 26. 17:40·DEV/C++

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" 를 유지시킨다.

저작자표시 비영리 동일조건 (새창열림)

'DEV > C++' 카테고리의 다른 글

헤더 중복 방지 #pragma once 와 Include Guard 차이  (0) 2024.05.20
JAN(Bar)Code 생성 QT Sample Source  (0) 2023.11.02
[MFC] Static Control 배경 투명화  (0) 2021.07.07
[MFC]Dialog UPDATE_COMMAND_UI 안먹는 문제  (0) 2021.07.05
[MFC] CheckBox, RadioButton 체크 옵션  (0) 2021.07.05
'DEV/C++' 카테고리의 다른 글
  • 헤더 중복 방지 #pragma once 와 Include Guard 차이
  • JAN(Bar)Code 생성 QT Sample Source
  • [MFC] Static Control 배경 투명화
  • [MFC]Dialog UPDATE_COMMAND_UI 안먹는 문제
retire
retire
    반응형
  • retire
    NeedRetire
    retire
  • 전체
    오늘
    어제
    • 분류 전체보기 (22)
      • DEV (21)
        • C++ (9)
        • Jenkins (6)
        • Socket (4)
        • NSIS (2)
      • PC Tips (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    VIAddVersionKey
    build step
    NSIS
    c4430
    Static Control
    NSIS 함수
    jenkins 설치
    #pragma once
    c++
    MFC
    헤더중복방지
    c2143
    순환 종속
    모니터인치
    버전 설정
    monitorinfoview
    VIProductVersion
    JAN code
    c2238
    include guard
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
retire
순환 종속(Circular Dependency) 와 전방 선언(Forward Declaration)
상단으로

티스토리툴바