헤더들이 서로를 인클루드하고 있는 상황을 어떻게

hey의 이미지

어떻게 타개해야 할까요?

예를 들어

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개 정도의 헤더파일을 거쳐서
결국 꼬리를 물게 됩니다.

byung82의 이미지

header 에 class B;

라고 정의를 하시고 cpp에 해당되는 class의 include를 넣어주시면 됩니다.

^^;

그럼

slayer의 이미지

이런 경우는 보통 템플릿을 써서 해결하죠..
물론 코드가 좀 알아보기 힘들어진다는 단점이 있긴하지만..-_-;

hey의 이미지

Quote:
header 에 class B;

라고 정의를 하시고 cpp에 해당되는 class의 include를 넣어주시면 됩니다.

이 말씀이..

#include "b.h"
class B;
class A {
  void blahblah(B*) { return; }
};

요런 식으로 하란 말씀이 아니신지요?
그건 가능하지만,

#include "b.h"
class B;
class A {
  B mB;
  B& getB() { return mB; }
};

요런 식으로 멤버 변수로 써버리면
실제 크기를 알아야 하기 때문에 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..


pynoos의 이미지

두 class가 상대를 멤버로 가지고 있는 것을 만드는 것은 불가능합니다.

그렇게 되면, 그 class이 크기는 무한대가 되어버리거든요.

위에서 처럼 pointer를 가지고 있어야 됩니다. 예외가 없지요.

뒷북인가요? ^^

hey의 이미지

Quote:
두 class가 상대를 멤버로 가지고 있는 것을 만드는 것은 불가능합니다.

그렇게 되면, 그 class이 크기는 무한대가 되어버리거든요.

물론입니다만..
두 클래스가 서로를 멤버로 가지고 있는 것이 아니라..

a 클래스가 b 클래스를 인수로 받고, b 클래스는 c 클래스의 포인터를
갖고 있고, c 클래스가 a 클래스를 멤버로 갖는 일은
드물지만 생기지 않겠습니까?

음..
이것은 궁금해서 묻는 것이구요,
코드는 일단 여러 분들이 도와주신 대로 고쳐야겠습니다. :)


----------------------------
May the F/OSS be with you..


nairs의 이미지

이런... 시간이 없어서 대충 훝어보니..

흠.. 중복선언되는 경우때문에 글을 올리시는것 같습니다만...

그런 경우라면... 각 파일에서 다음과 같이 Pre-Processor 를 쓰시면...

정상적으로 컴파일 될겁니다.

#ifndef __A_H__
#define __A_H__
#include b.h

class A {
 ......
}
#endif


#ifndef __B_H__
#define __B_H__
#include c.h
class B {
 ......
}
#endif





#ifndef __C_H__
#define __C_H__
#include a.h
class C {
 ......
}
#endif

건성으로 대답하는듯 해서 죄송합니다... ㅡㅡa

\ 별을 보며 소원을 빌 때 당신이 누구인지는
\ 중요하지 않습니다. 당신이 소망하는 것이
★ 무엇이든, 포기하지 않는 한 그 꿈은 이루어
집니다. <司法試驗 合格記 中>

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.