2009/05/11 00:37 else if (개발)
c++로 라이브러리를 개발하다가 다음과 같은 소스가 나오게 되었다.
//apis.h
#include "A.h"
#include "B.h"

class Apis {
public:
    void publicMethod1();
    void publicMethod2();

private:
    void privateMethod1(A a);
    void privateMethod2(B b);
};
//apis.h 끝

//라이브러리 사용하는 코드
#include "apis.h"

Apis apis;
apis.publicMethod1();
apis.publicMethod2();

라이브러리는 개발이 다 끝나고 사용자에게는 컴파일된 라이브러리 파일 하나와 API 정의를 담고 있는 헤더파일만 전달되는 것이 정상이다. 위 소스에서 말하고 있듯이 라이브러리 내부적으로 무슨 로직을 지지고 볶든지 간에 라이브러리를 사용자가 선언하는 클래스는 Apis라는 클래스 한개이고, 호출하는 메소드는 publicMethod1, publicMethod2 딱 두개 뿐이다.

그런데, apis.h를 include하기 위해서는 반갑지 않은 떨거지들이 따라오게 되는데, A.h와 B.h가 그것들이다.

결국 헤더 파일 두개가 추가로 라이브러리에 포함되어야만 하는 사태다. 근데, 어디 그뿐인가. 만약 A.h와 B.h가 다른 헤더파일을 include하고 있다면? 그것도 같이 들어가야 하네? 그러다가 결국 모든 헤더파일을 다같이 실어 올려야 하는 볼썽 사나운 일이 생기게 된다.


이럴 때는 전방선언(forward declaration)을 사용해야 한다.
//apis.h
//이제 A.h와 B.h를 include할 필요없다.

//전방 선언(forward declaration)
class A;
class B;

class Apis {
public:
    void publicMethod1();
    void publicMethod2();

private:
    void privateMethod1(A a);
    void privateMethod2(B b);
};
//apis.h 끝

//apis.cpp
//대신 cpp에서 include해야 한다.
#include "A.h"
#include "B.h"
...

A.h와 B.h를 apis.h가 아닌 apis.cpp에 include함으로써, 공개되는 라이브러리에는 빠져도 상관이 없게 된다.
posted by 심보준

Trackback | http://blog.sragent.pe.kr/trackback/27 관련글 쓰기

댓글을 달아 주세요

  1. 갑자기 웬 c++ 기본 강의를 하세염?
    아, 그러고 보니 형은 종종 기교가 없는, 섬세한 기본을 닦게 하는 스타일이셨던 같아염. ㅋㄷㅋㄷ
    아, 제가 써놓고 봐도 너무 좋은 수식어다. '기교가 없는데도, 섬세한' ....^^;

    • 심보준 2009/05/15 12:54  Addr Edit/Del

      요새 c++로 개발하다가 직접 만난 문제였거든.
      c++로 개발을 처음 해봐서 기본 부터 공부하고 있어.

  2. sambitious 2010/08/13 16:32  Addr Edit/Del Reply

    감사합니다 ㅠㅠ
    .cpp 파일에서 include를 해줘야하는걸 몰라서
    계속 에러가 났었는데 해결 했네요

prev 1 next