2011-01-21 6 views
24

안녕하세요. I 클래스 .H 파일 또는 실행 파일 통화 당에서 클래스 생성자의 본문을 정의 할 수 있습니다헤더 파일 VS 생성자 (.cpp) 파일에 생성자 정의

이 그냥 어쨌든 여기에 우리가 간다 '개인 환경 설정'카테고리에 해당 될 수 .... 이 두 스타일은 컴파일러가 특정 프로젝트 내에서 염려하는 한 동일합니다 (프로젝트는 dll을 의미합니다). 동일하게 모든 멤버 함수에 동일하게 적용됩니다. 헤더 파일에 정의되거나 정의 된 다음 cpp 파일에 정의 될 수 있습니다. 그러나이

...

는 내가 다른 프로젝트에서 같은 클래스 헤더 파일을 포함해야하는 경우 (헤더 파일을 사용하여 궁극적으로 코드가 다른 DLL을에 끝을 의미) 발견 헤더 파일에 실제 구현을하는 것은 컴파일시에 두통을 일으킨다. (필자는 그 시점에 도달하지도 않는다.) 왜? 잘 자세히 설명하지는 않겠지 만 컴파일러는 분명히 다른 헤더 파일 등에서 정의 된 모든 함수를 해결하려고합니다 ... 가난한 개발자가 다양한 헤더 파일을 가져 오기 시작하도록 강요합니다 ...

LONGSTORY short :

헤더 파일을 구현에서 제외하고 '선언'으로 사용하는 것이 가장 좋지 않습니까? 그렇게하면 많은 여분의 쓰레기를 가지고 다닐 필요없이 하나 이상의 프로젝트에 이들을 포함시키는 것이 더 쉬울 것입니다.

당신의 의견은 어떻습니까? 감사합니다.

답변

21

구현이 인라인되기를 원하지 않는다면 (예 : 간단한 getter/setter) 헤더를 구현하지 않을 수 있습니다. 물론 템플릿이 아니라면 말이죠.

생성자에 대한 예외를 만들 필요가 없습니다. .cpp 파일에 넣으십시오.

+1

헤더에 구현을 넣을 수있는 경우도 있습니다. 두 개의 서로 다른 파일이 서로를 포함 할 필요가 있다면 헤더에서 수행 할 수 없으므로 cpp에서 완료해야합니다. –

+0

"할 수 없다"는 뜻이며 "할 수 없다"는 뜻입니다. 그렇지 않으면 좋은 지적입니다. – Thomas

+2

'사소한'예외는 간단한 생성자에 쉽게 적용 할 수 있습니다. 다르게 취급하거나 인라인되지 않도록 할 이유가 없습니다. –

17

주목할 점 중 하나 중요한 점은 멤버 함수가 헤더 파일 내에 정의 된 경우 클래스 본문 내에 있거나 반드시 inline으로 명시 적으로 표시해야한다는 것입니다. 그것이 어떤 기능이 있어야합니다 분명있는 동안 컴파일러는 각 컴파일 단위의 정의를 포함하기 때문에

class A { 
    public: 
    A(); 
}; 

A::A() { 
    // constructor body 
} 

가 잘못된 이유는 다음과 같습니다 즉, 헤더 파일에서이 작업을 수행하려면 일반 잘못 한 번만 정의됩니다. 생성자가 인라인 두 경우 모두

class A { 
    public: 
    inline A() { // inline isn't required here, but it's a good style 
    // constructor body 
    } 
}; 

:

class A { 
    public: 
    inline A(); 
}; 

inline A::A() { 
    // constructor body 
} 

또는 : 여기에 같은 일을 할 수있는 올바른 방법이 있습니다. 일반적인 아웃 오브 라인 함수로 만드는 유일한 방법은 헤더가 아닌 구현 파일에 정의하는 것입니다. 이것이이 두 가지 접근 방식의 가장 중요한 차이점입니다.

이제는 인라인을 최적화하는 것이 중요합니다. 최적화와 함께 항상 그렇듯이, 필요성이 입증 될 때까지는 피하는 것이 가장 좋습니다.인라인하는 다른 문제들 중에는 호환성 문제가 있습니다. 인라인되지 않은 함수의 본문을 변경하면 정의 된 곳에서만 유닛을 다시 컴파일하면됩니다. 모든 사람이 즉시 새 구현을 사용하기 시작합니다. 인라인 함수를 사용하면 관련 머리글을 포함하는 모든 유니트를 다시 컴파일해야하는데, 특히 여러 사람이 서로 다른 프로젝트에서 헤더를 사용하는 경우에는 고통 스러울 수 있습니다.

즉, 특정 함수 호출이 성능 병목 현상임을 프로파일 링하여 입증 될 때까지 가능한 한 정기적 인 라인 외부 정의를 사용하십시오. 이 규칙에 대한 유일한 예외는 사소한 setter와 getter 뿐이며 심지어 조심하는 것이 낫습니다. 언젠가는 평범하지 않게되고 재 컴파일과 호환성이 많이 떨어질 것입니다.

1

고려해야 할 또 다른 참고 사항 : 헤더 파일을 변경하면 해당 헤더 파일을 포함하는 모든 파일을 다시 작성해야합니다. 대부분의 빌드 시스템은 수정 된 헤더 파일에 의존하는 원본 (* .cpp/.cc) 파일을 다시 작성합니다.

헤더 파일에 정의 된 클래스의 메서드를 변경하면 헤더 파일을 포함한 모든 소스 파일이 다시 작성됩니다. 소스 파일에서 메소드를 변경하면 소스 파일 만 재 빌드됩니다. 이것은 중간 규모 이상의 프로젝트에서 문제가 될 수 있습니다.

빌드 프로세스를 단순화하려면 클래스의 대부분의 메서드를 소스 파일에 정의해야합니다. 작은 메소드와 다른 인라인 후보가 헤더 파일에 정의되어야합니다.