C++파일 의존 관계 소개

5931 단어 파일 의존 관계
파일 을 다시 컴 파일 하 는 시간 이 짧 거나 시간 이 길 어도 괜찮다 고 생각한다 면,어차피 다시 컴 파일 해 야 한다 면,이 글 을 생략 하 는 것 도 선택 할 수 있 지만,탐색 하 는 것 도 권장 합 니 다.만약 네가 이 내용 을 배우 고 싶 거나 관심 을 가지 고 싶다 면,이 글 은 반드시 너 에 게 수확 을 가 져 다 줄 것 이다.우선 의존 관계 에 대한 정 의 를 내리 지 않 고 예 를 들 겠 습 니 다.4567913)컴 파일 러 가 클래스 string,Date,Image 의 정 의 를 알 지 못 하면 class People 은 컴 파일 을 통 해 컴 파일 할 수 없습니다.일반적으로 이 정의 식 은\#include 에 포 함 된 헤더 파일 에 의 해 제공 되 기 때문에 일반 People 에 이러한 예비 처리 명령

 class Peopel{
 public:
     People(const std::string & name,const Date& brithday,Image Img)
     std::string name( ) const;
     Date birthDate( ) const;
     Image img( ) const;
     ...
 private:
     std::string theName;               //
     Date theBirthDate;                 //
     Image img;                         //
 };
이 있 으 면 People 정의 파일 과 이 세 파일 사이 에 컴 파일 의존 관 계 를 형성 합 니 다.이 헤더 파일 들 이 어떤 파일 이 바 뀌 었 거나,이 헤더 파일 들 이 다른 헤더 파일 에 의존 했다 면,People 클래스 를 포함 하 는 모든 파일 은 다시 컴 파일 해 야 하고,People 클래스 파일 을 사용 해도 다시 컴 파일 해 야 한다.만약 에 한 항목 에 수천 개의 파일 이 포함 되 어 있 고 모든 파일 에 다른 몇 개의 파일 이 포함 되 어 있다 면 순서대로 한 파일 의 내용 을 바 꾸 려 면 거의 모든 항목 을 다시 컴 파일 해 야 한다.이것 은 매우 어 설 픈 일이 라 고 할 수 있다.
우 리 는 다음 과 같은 변경

  #include <string>
  #include "date.h"
  #inblude "image.h"
 class Peopel{
 public:
     People(const std::string & name,const Date& brithday,Image Img)
     std::string name( ) const;
     Date birthDate( ) const;
     Image img( ) const;
     ...
 private:
     std::string theName;               //
     Date theBirthDate;                 //
     Image img;                         //
 };
을 진행 할 수 있 습 니 다.그러면 People 이 인터페이스 가 바 뀌 었 을 때 만 다시 컴 파일 할 수 있 습 니 다.그러나 이렇게 연 결 된 문제 가 있 습 니 다.첫 번 째 string 은 class 가 아니 라 typedef basic 입 니 다.string string。따라서 상기 선행 성명 이 정확 하지 않 습 니 다(stl 완전 코드 에 첨부).정확 한 사전 성명 은 비교적 복잡 하 다.사실 표준 라 이브 러 리 부분 에 대해 서 는\#include 예비 처리 명령 만 포함 시 키 면 됩 니 다.

 namespace std {
     class string;
 }
 class Date;
 class Image;

 class Peopel{
 public:
     People(const std::string & name,const Date& brithday,Image& Img)
    std::string name( ) const;
    Date birthDate( ) const;
    Image img( ) const;
    ...
private:
    std::string theName;                //
    Date theBirthDate;                 //
    Image img;                         //
};
사전 성명 의 또 다른 문 제 는 컴 파일 러 가 컴 파일 기간 에 대상 의 크기 를 알 고 공간 을 분배 해 야 한 다 는 것 이다.예 를 들 어

 #ifndef __STRING__
 #define __STRING__

 #include <std/bastring.h>

 extern "C++" {
 typedef basic_string <char> string;
 // typedef basic_string <wchar_t> wstring;
 } // extern "C++"

#endif

컴 파일 러 가 x 의 정의 식 을 보면 메모리 가 얼마나 분배 되 어야 하 는 지 알 지만 p 정의 식 을 보면 알 수 없다.하지만 포인터 로 설정 하면 알 수 있 습 니 다.포인터 자체 의 크기 컴 파일 러 가 알 고 있 기 때 문 입 니 다.4567913)People Impl 은 다음 세 가지 데 이 터 를 포함 하고 People 의 구성원 변수 포인터 가 이 People Impl 을 가리 키 고 있 습 니 다.그러면 현재 컴 파일 러 는 People 정 의 를 통 해 분배 공간의 크기,포인터 의 크기 를 알 수 있 습 니 다.

  int main(int argv,char * argc[ ])
    {
        int x;
        People p( );
        ...
    }
이렇게 해서 People 은 Date,Imge,People 의 실현 과 분 리 됩 니 다.위의 수정 사항 들 은 People 파일 을 다시 컴 파일 할 필요 가 없습니다.그리고 이렇게 써 서 포장 을 강화 했다.이렇게 하면 문서 의 의존 관 계 를 낮 출 수 있다.여기 서 낮은 의존 도 를 낮 추 는 방법 을 요약 한다.
1.클래스 성명 이 가능 하 다 면 클래스 정 의 를 사용 하지 마 세 요.2.데 이 터 를 이 데 이 터 를 가리 키 는 지침 을 통 해 표시 합 니 다.3.성명 식 과 정의 식 에 서로 다른 헤더 파일 을 제공 합 니 다.이 두 파일 은 일치 성 을 유지 해 야 하 며,성명 식 이 바 뀌 면 두 파일 모두 바 뀌 어야 한다.따라서 일반적으로 약간의 함수 가 아 닌\#include 성명 파일 이 있 습 니 다.피 플 처럼 정 해 요. 

#include <string>
#include <memory>

class PeopleImpl;
class Date;
class Image;
class People{
public:
   People(const std::string & name, const Date& brithday, const Image &Img);
   std::string name( ) const;
   Date birthDate( ) const;
   Imge img( ) const;
   ...
private:
   PeopleImpl * pImpl;
}

또 다른 Handle 류 표기 법 은 People 을 특수 한 abstract base class 로 만 드 는 것 을 Interface 류 라 고 부른다.인터페이스 라 는 키 워드 를 보면 C\#,자바 에 익숙 한 친구 들 이 문득 깨 달 았 을 수도 있 습 니 다.이 인 터 페 이 스 는 구성원 변 수 를 가지 고 있 지 않 고 구조 함수 도 없 으 며 하나의 virtual 석조 함수 와 하나의 순 허 함수 만 있 으 며 전체 인 터 페 이 스 를 표시 합 니 다.People 을 위 한 interface class 는 이렇게 보 입 니 다.4567913)대상 을 어떻게 만 듭 니까?그것들 은 보통 특수 함 수 를 호출한다.이런 함 수 는 일반적으로 공장 함수 나 허구 함수 라 고 부른다.그것들 은 동적 분배 대상 을 가리 키 며,인터페이스 클래스 의 인 터 페 이 스 를 지원 합 니 다.

 public PeopleImpl
 {
     public:
         PeopleImple(...)
         ...
     private:
         std::string theName;                //
         Date theBirthDate;                 //
         Image img;                         //

interface 류 인 터 페 이 스 를 지원 하 는 종 류 는 반드시 정의 되 어야 하고 진정한 구조 함 수 는 반드시 호출 되 어야 한다

 #include "People.h"
 #include "PeopleImpl.h"

 People::People(const std::string& name, const Date& brithday, const Image& Img)
 :pImpl(new PersonImpl(name,brithday,addr))
 { }
 std::string People::name( ) const
 {
     return pImpl->name( );
 }
RealPeople 류 가 있어 야 한다.우리 People:create 는 이렇게 쓸 수 있다

 class People{
 public:
     virtual ~People( );
     virtual std::string name( ) const = 0;
     virtual Date brithDate( ) const =0;
     virtual Image address( ) const =0;
     ...
 };
Handle 류 와 interface 류 는 인터페이스 와 실현 간 의 결합 관 계 를 해제 하여 파일 간 의 컴 파일 의존 도 를 낮 출 수 있다.그러나 동시에 일부 성능 과 공간 도 손실 되 었 다.

좋은 웹페이지 즐겨찾기