-
전방선언과 헤더파일 포함할때..쥬신게임아카데미/궁금했던것 2015. 11. 24. 01:49
중복된 헤더파일 포함에 대해선 아래 글부터 읽고
전방선언
class A;
이런식으로
class B
{public:
A* ptr
}
B클래스 앞에 정의를 한다면 헤더파일을 포함하지 않고
포인터로 변수를 선언할 수 있는데..
이게 중복된 인클루드를 피할 수가 있다.(A의 실제 헤더는 B.cpp에 포함해야한다)
만약에
#include"b.h"
class A
#include"a.h"
class B가 있다면
보통은 중복을 안하려고 #pragma once를 붙이는데..(#ifndef ~ #endif나..)
그럼
#pragma once
#include"b.h"
class A
{...}
#pragma once
#include"a.h"
class B
{..}
이렇게 할텐데 하나씩 따라가보면..
b.cpp를 컴파일 한다고 하자
그럼 b.cpp 상단에는 b.h가 include되어있을거고.. 그래서 컴파일러는 b.h를 포함시킨다.
그런데 b.h를 가보니 a.h가 include가 되어있다. 그럼 그 헤더도 포함해야겠지
그래서 이번에는 a.h가보니까 상단에 b.h가 include되어있네? 좀 전에 b.cpp에서 include했는데도
불구하고 한번더 include하려고 하는데..(아직 class B가 전부 읽혀진건 아니다.)
하지만 a.h상단에 #pragma once구문 때문에 헤더파일은 단 한번만 불려와지게 되고 결국
a.h에 있는 #include "b.h"는 있으나 마나가 된다.
그런데 문제가 있는데... 만약에 class A에
멤버변수로 B b클래스가 있다면? B는 이세상에 없는 클래스로 인식하고 형식이 없다는 에러를 출력한다.
혹시 만약 class A에 포함된 에러 헤더파일 중 B를 필요로 하는 헤더가 있다면 더 많은 오류를 발생시킨다.
마찬가지로 a.cpp을 컴파일 할때는 방금 위의 상황과는 반대가 되고 절차는 똑같다..
간접적으로 서로 포함해도 문제가 된다.
아래처럼..
#pragma once
#include"c.h"
class A
{
B b;
...}
#include"a.h"
class B
{
A a;
... }
#pragma once
#include"b.h"
class C
{...}
이것도 서로는 포함하지 않았지만 각 파일에 포함된 헤더파일들에 포함되어 간접적으로 포함한 경우가 된다.
그렇다고 #pragma once를 없애면? 두번 포함되어 더 에러가 생긴다.
이런것에 대한 해결책이 가장 처음에 나왔던 전방선언이다..
#pragma once
class B;
class A
{
B* ptr;
}
#pragma once
class A; //전방선언 일종의 암시 나중에 링크과정에서나 찾어란 뜻
class B
{
A* ptr;
}
이런식으로 하면된다. 그럼 헤더는? 각각의 소스파일에 포함해야한다.
만약 일반변수를 햇다면 A a B b 크기를 알아야해서 헤더를 포함해야한다..또 인라인 코드를 헤더에 바로 넣어서 ptr = new 이런거 하면 안된다..또 크기를 알아야하고..
A* GetPtr() return ptr; 이런건 된다. 당장 a를 몰라도 되니까 포인터니까..
'쥬신게임아카데미 > 궁금했던것' 카테고리의 다른 글
정리 (0) 2016.01.16 싱글싱글턴 (0) 2016.01.06 메모리값 관련.의미.. (0) 2015.12.29 메모리 구조관련(미해결..) (0) 2015.12.29 소수점을 정수로 캐스팅 할때 (0) 2015.11.26