상호 참조 오류

너무 길어서 잘 안나오는군요ㅠㅠㅠ
그래두 애러 number와 간략한 설명이 있으니 만족합니다^^
먼저, 예를 들기 전에 정말 간단히 세개의 파일을 만들어봅니다~
1. main.c 2.ClassA.h 3.ClassZ.h
#include "ClassA.h" class ClassA class ClassZ
#include "ClassZ.h" { {
int ax; int zx;
int ay; int zy;
int main() } }
{
int ma;
ClassA a;
ClassZ z;
int mb;
}
OS가 식당이고 이 프로그램이 손님이라고 가정을 해보겠습니다~
예약을 할때 "저녁6시에 5명 예약이요~"라고 하죠?
그럼 식당에서 자리가 비어있으면 "네~준비해드리겠습니다"라고 하죠.
즉 5명이라는 규모를 알리고 식당은 이에 대한 대비가 가능할거에요~
근데 이런 상황은 어떻게 할까요?
손님 : 저녁 6시에 갈테니까 자리 준비해주세요
식당 : 몇명이신가요?
손님 : 그건 모르겠고 그냥 준비해주세요..
식당 : ..............(멍....)
상식적으로 보면 될리가 없겠죠??^^
몇명 -> 몇 바이트~이렇게 되겠죠~
자...그럼 저위의 파일 3개가 메인팀, 클래스A팀, 클래스Z팀이라고 가정을 해보겠습니다.
각각의 팀별 규모를 알아야 예약이 가능하겠쬬?
main.c / ClassA.h / ClassZ.h
(1)컴파일러가 컴파일을 시작합니다.
(2)main.c를 컴파일 하여 프로그램의 규모를 알아내려 합니다.
(3)int ma;를 만났습니다. 프로그램의 규모가 (4)가 됐습니다.
(4)ClassA a;를 만났습니다. 어라? 알수 없는 형식이네요? 헤더를 쫓아갑니다.
(5)ClassA.h를 컴파일 합니다.
(6)int ax;를 만났습니다. 클래스A의 규모가 (4)가 됐습니다.
(7)int ay;를 만났습니다. 클래스A의 규모가 (8)이 됐습니다.
(8)OK!!! ClassA.h가 끝났습니다. 클래스A의 규모는 (8)입니다. ClassA.obj를 만듭니다.
(9)<main.c로 돌아와서>그럼 클래스A의 규모를 프로그램규모에 더합니다. 프로그램의 규모가 (12)가 됐습니다.
(10)ClassZ z;를 만났습니다. 어라? 또 알수 없는 형식이네요? 헤더를 쫓아갑니다.
(10)ClassZ.h를 컴파일합니다.
(11)int zx;를 만났습니다. 클래스Z의 규모가 (4)가 됐습니다.
(12)int zy;를 만났습니다. 클래스Z의 규모가 (8)이 됐습니다.
(13)int zz;를 만났습니다. 클래스Z의 규모가 (12)가 됐습니다.
(14)OK!!! ClassZ.h가 끝났습니다. 클래스Z의 규모는 (12)입니다. ClassZ.obj를 만듭니다.
(15)<main.c로 돌아와서>그럼 클래스Z의 규모를 프로그램규모에 더합니다. 프로그램의 규모가 (24)가 됐습니다.
(16)int mb;를 만났습니다. 프로그램의 규모가 (28)이 됐습니다.
그럼 본론으로 들어가겠습니다~
예를 들어 다시 세개의 파일을 만듭니다
1.main.c 2.ClassA.h 3.ClassZ.h
#include "ClassA.h" class ClassA class ClassZ
#inlcude "ClassZ.h" { {
int ax; int zx;
int main() int ay; int zy;
{ ClassZ * pz; ClassA *pa;
int ma; } }
ClassA a;
ClassZ z;
int mb;
}
자..정상적인 부분을 이해하셨다면 뭐가 문제인지 아실겁니다~
main.c에 정체불명의 "ClassA a;"를 만났습니다. ClassA.h를 쫓아갑니다.
ClassA.h에 정체불명의 ClassZ * pz;를 만났습니다. ClassZ.h를 쫓아갑니다.
ClassZ.h에 정체불명의 ClassA * pa;를 만났습니다. ClassA.h를 쫓아갑니다.
ClassA.h에 정체불명의 ClassZ * pz;를 만났습니다. ClassZ.h를 쫓아갑니다.
ClassZ.h에 정체불명의 ClassA * pa;를 만났습니다. ClassA.h를 쫓아갑니다.
다행일지 몰라도 컴파일러는 나름 똑똑한지 계속 무한루프를 돌진 않군요~
"ClassZ * pz;가 뭡니까? 식별할 수 있는게 필요합니다. 이런식으로 나오믄 크기를 걍 int형으로 생각해버리겠습니다"
이렇게 경고를 줍니다~젤 위에 사진의 내용이 이런 식입니다^^
우선 문제가 제가 예전에 무언가 만들다가 상호참조가 자주 발생했었는데
현재는 어떻게 저렇게 만드는지 이해가 가질 않는군요^^
간략히 상호 참조를 해결하려면 ClassA나 ClassZ의 헤더파일에 해더를 인클루드하지말고 간단히 Class가 있다고 정의만 내려줍니다~
ClassZ.h 이파일을 수정해보겠습니다.
class ClassA;
class ClassZ
{
int zx;
int zy;
ClassA * pa;
}
ClassZ.h가 있다면 ClassZ.c파일이 있겠죠~
ClassZ.c파일에서 간단히 #include "ClassA.h"로 인클루드만 하시면 회피합니다.
class ClassA;를 선언함으로써 "글쎄 obj가 없어도 일단 이런 클래스가 있다는 가정하에 님부터 크기를 파악해줘"라는게 됩니다.
그럼 일단 ClassZ.obj를 "ClassA"라는 클래스가 있다는 가정하에 만들게 되고, 오브젝트를 모두 만든후에 링크를 걸때는 classZ.c에 선언된 헤더를 보고 링크를 걸게 되는거죠~













댓글을 달아 주세요