[완료] c++ 클래스를 분리해서 정의하고 구현할 때 궁금한 점이 있습니다.

litmus80의 이미지

안녕하세요.

C++ 소스를 분석하다가 궁금한 점이 생겨서 글을 올립니다.

소스파일들을 보는데 대부분 다음과 같이 CFooB 클래스에 대한 헤더파일을 정의부가 아닌 구현부에서
직접 include 시키더라구요..

=================================================================================

[CFooA.h]

class CFooB; // CFooB 클래스를 선언만 해 둠.

class CFooA

{

CFooB obj;

}

=================================================================================

[CFooA.cpp]

#include "CFooA.h"

#include "[CFooB 가 정의된 헤더 파일]"

class CFooA

{
CFooB obj;
}

=================================================================================

CFooA.h 파일에서 CFooB 클래스를 선언만 해 준 이유가 컴파일 에러를 방지하기 위한 것은 알겠지만.
근데 왜 굳이 'CFooB 가 정의된 헤더 파일'을 구현부 쪽에서 인클루드 시키는 걸까요?

제 생각에는 차라리 CFooB를 사용할 것이라면 애초에 CFooA.h 에서 인클루드 시키는게 나을거 같은데;;...
이런걸 무척 자주 발견해서 궁금해졌습니다..;; 혹시 코드를 이렇게 작성하는 이유가 있는건가요?

궁금합니다 ^^;

klara의 이미지

참고로 위 코드는 컴파일되지 않습니다.
전방선언을 이용할수 있는 건 포인터나 레퍼런스로 선언할때 입니다.

해더파일에서 다른 해더파일을 포함하는 것을 피하는 이유는 컴파일시의 의존성을 줄이기 위해서입니다.

class A의 선언이 a.h에 있고, class B(b.h, b.cpp)에서 class A를 이용하고 있고, class C(c.h, c.cpp)에서 class B를 이용하는 경우를 생각해보면, c.h던 c.cpp던 어느쪽인가에선 b.h를 포함해야 합니다. 마찬가지로 b.h혹은 b.cpp에서는 a.h를 포함해야 합니다.

1. b.h에서 a.h를 포함하는 경우
이경우 a.h가 수정되면, b.cpp도 물론 재컴파일되야 하지만, c.cpp class A를 직접 이용하던 안하던 상관없이, b.h를 통해서 a.h의 내용을 포함하고 있기 때문에 재컴파일되야 합니다.
2. b.cpp에서 a.h를 포함하는 경우
이경우 a.h가 수정되더라도, c.cpp에서 class B의 멤버인 class A의 객체를 이용하지 않는 한, a.h를 포함하지 않기 때문에 재컴파일해야하는 것은 b.cpp만입니다.

파일이 세개인 경우는 파일 한개 더 컴파일 하는 것으로 해결되지만, 대규모 프로젝트에서 컴파일의존성이 많은 경우 시간상 많은 손실이 발생하게 됩니다.

litmus80의 이미지


아 그랬군요~ xylosper님 정말 감사합니다. *^^*

저런 방식을 전방선언이라고 부른다는 것도 처음 알았습니다.
게다가 궁금했던 점도 속시원히 해결했네요.

다시한번 정말 감사합니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.