헤더들이 서로를 인클루드하고 있는 상황을 어떻게
글쓴이: hey / 작성시간: 화, 2003/04/15 - 6:34오후
어떻게 타개해야 할까요?
예를 들어
A.h #ifndef ... #inc B.h ClassA blahblah(ClassB*) B.h #ifndef ... #inc A.h ClassB ClassA mA
클래스A는 매개변수로써 클래스B를 필요로 하고,
클래스B는 멤버 변수로 클래스A를 필요로 하는 상황입니다.
만약에 두 클래스 다 서로의 포인터만을 사용한다면
A.h #inc B.h ClassB ClassA blahblah(ClassB*) B.h #inc A.h ClassA ClassB ClassA mA
이렇게 사용하기 전에 한 번씩 선언을 해주면 되겠지만
맴버 변수로 선언할 때는 실제 크기를 알아야 하므로
완전한 정의가 있어야 하는 것으로 알고 있습니다.
음..
어떻게 하는게 좋을까요?
여기선 예로 들어서 바로 꼬리를 물게 되었지만
실제 코드에서는 4개 정도의 헤더파일을 거쳐서
결국 꼬리를 물게 됩니다.
Forums:
header 에 class B; 라고 정의를 하시고 cpp에 해당
header 에 class B;
라고 정의를 하시고 cpp에 해당되는 class의 include를 넣어주시면 됩니다.
^^;
그럼
Template
이런 경우는 보통 템플릿을 써서 해결하죠..
물론 코드가 좀 알아보기 힘들어진다는 단점이 있긴하지만..-_-;
[quote]header 에 class B;라고 정의를 하시고 c
이 말씀이..
요런 식으로 하란 말씀이 아니신지요?
그건 가능하지만,
요런 식으로 멤버 변수로 써버리면
실제 크기를 알아야 하기 때문에 incomplete하다고
에러를 내게 돼있습니다.
물론 #include "b.h" 에서 실제 정의를 가져올 수 있지만
그게 안될 때가 있죠.
b.h에서 이미 a.h를 인클루드 했을 때입니다.
class B 의 정의가 나오기 전에 a.h를 불러버리므로
class A에서 참고할 class B의 정의가 실제로 없는 것이죠.
물론 이렇게 두 개가 서로 부르는 것은 극단적인 경우이고,
제 코드에서 문제는, 원한 바는 아니지만
a가 b를 b가 c를 c가 d를 d가 a를 부르게 되는
상황이 벌어져서 문제가 되고 있습니다. ... :cry:
다행히 고마우신 분이 템플릿을 이용하는 방법이 있다고
써주셨으니 거기에 대해서 생각해봐야겠습니다..
----------------------------
May the F/OSS be with you..
두 class가 상대를 멤버로 가지고 있는 것을 만드는 것은 불가능합니다
두 class가 상대를 멤버로 가지고 있는 것을 만드는 것은 불가능합니다.
그렇게 되면, 그 class이 크기는 무한대가 되어버리거든요.
위에서 처럼 pointer를 가지고 있어야 됩니다. 예외가 없지요.
뒷북인가요? ^^
---
http://coolengineer.com
[quote]두 class가 상대를 멤버로 가지고 있는 것을 만드는 것은
물론입니다만..
두 클래스가 서로를 멤버로 가지고 있는 것이 아니라..
a 클래스가 b 클래스를 인수로 받고, b 클래스는 c 클래스의 포인터를
갖고 있고, c 클래스가 a 클래스를 멤버로 갖는 일은
드물지만 생기지 않겠습니까?
음..
이것은 궁금해서 묻는 것이구요,
코드는 일단 여러 분들이 도와주신 대로 고쳐야겠습니다. :)
----------------------------
May the F/OSS be with you..
중복선언 방지하는법?
이런... 시간이 없어서 대충 훝어보니..
흠.. 중복선언되는 경우때문에 글을 올리시는것 같습니다만...
그런 경우라면... 각 파일에서 다음과 같이 Pre-Processor 를 쓰시면...
정상적으로 컴파일 될겁니다.
건성으로 대답하는듯 해서 죄송합니다... ㅡㅡa
\ 별을 보며 소원을 빌 때 당신이 누구인지는
\ 중요하지 않습니다. 당신이 소망하는 것이
★ 무엇이든, 포기하지 않는 한 그 꿈은 이루어
집니다. <司法試驗 合格記 中>
댓글 달기