C++파일 의존 관계 소개
5931 단어 파일 의존 관계
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
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 류 는 인터페이스 와 실현 간 의 결합 관 계 를 해제 하여 파일 간 의 컴 파일 의존 도 를 낮 출 수 있다.그러나 동시에 일부 성능 과 공간 도 손실 되 었 다.