ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전방선언과 헤더파일 포함할때..
    쥬신게임아카데미/궁금했던것 2015. 11. 24. 01:49

    중복된 헤더파일 포함에 대해선 아래 글부터 읽고

    http://ekessy.tistory.com/20

     

    전방선언

    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;

    ...}

     

    #pragma once

    #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
Designed by Tistory.