2010-12-11 6 views
2

대부분 서로를 사용하는 프로그램 내에서 여러 클래스를 만들 때 난 혼란을 줄이기 위해 필요한 최소한의 헤더 파일 만 포함하고 싶습니다.다른 헤더에 포함 된 파일을 포함해야합니까?

예를 들어 클래스 C는 클래스 A를 포함하는 클래스 B에서 상속 받았다고 가정합니다. 이제 클래스 B는 클래스 A를 멤버로 포함하므로 a.hb.h에 포함해야합니다. 그러나 C에 a.h을 포함시켜야한다고 가정 해 봅시다. 나로서는 게으르다. 단지 b.h (어쨌든 포함시켜야 함)을 포함하고, b.h에는 이미 a.h이 포함되어 있으므로 더 이상 포함 할 필요가 없으며 잘 컴파일된다. 내 .cpp 파일과 동일합니다. 헤더 만 포함하면 헤더에 포함 된 모든 내용이 자동으로 .cpp 파일에 포함되므로 여기에 포함시키지 마십시오.

내 습관이 좋지 않습니까? 그것은 내 코드를 읽기 어렵게 만드나요?

답변

4

외부 포함 순서에 의존하지 않고 헤더 파일을 구문 분석하는 데 필요한 것을 포함시킵니다. 즉, 헤더를 자급 자족하게 만듭니다.

c.h이 을 상속하는 class C을 나타내면 분명히 B.h을 포함해야합니다.그러나 class Ac.h에 나타나지 않는다면, 나는 그것을 포함 할 이유가 없다고 생각합니다. b.hA이 포함되어 있다는 사실은 이 A이라고 명시 적으로 또는 a.h을 포함하여 구문 분석해야하는 것을 만들어야 함을 의미합니다.

제 관점에서 보았을 때,해야 할 일을하고 있습니다.

c.hA을 언급하기 시작하면 적절한 포함 또는 전달 선언을 추가하므로 사실 b.h에 의존하지 않습니다.

6

나는이 간단한 규칙을 고수한다 : 주어진 클래스를 완전히 선언하고 더 많은 것을 포함하지 말고 다른 소스에서 가져온 것을 포함 할 것인지, 즉 파일이 자급 자족 할 수 있는지에 대한 가정을하지 말라.

2

직접 사용하는 정의가있는 모든 헤더를 포함하는 것이 가장 좋습니다.

다른 헤더 중 하나에 물건을 포함 시키면 코드가 외부에있는 클래스의 구현에 종속되므로 코드가 더 취약 해집니다.

EDIT :

짧은 예 :

  • 클래스 B가 사용하는 클래스 A, 예를 들어 해싱 메커니즘을 사용하는 해시 테이블 구현 B A

  • 다른 용도로 해시 테이블 (예 : B) 및 해시 알고리즘 (예 : A)이 필요한 클래스 C를 만듭니다. 당신은 B.h를 포함하고 어쨌든 B.h가 포함하기 때문에 A.h를 버립니다.

  • 동료 중 한 명인 Mary는 충돌 가능성을 줄이는 새로운 멋진 해싱 알고리즘에 대해 10 % 적은 공간이 필요하고 두 배 빠른 속도로 종이를 발견합니다. 그녀는 (올바르게) 클래스 B를 다시 작성하여 그 알고리즘을 구현하는 클래스 D를 사용합니다. 클래스 A는 B에서 더 이상 필요하지 않으므로, B.h.

  • 코드가 손상됩니다.

편집 2 :

일부 프로그래머들은 (그리고 나는 가끔 때 서둘러도이 유죄 봤는데)에 "포함 모두"헤더 파일을 가지고이 문제를 처리하는 사람들이있다 그들의 프로젝트에서. 비교할 수없는 비율로 네임 스페이스를 오염 시키므로 피해야합니다. 그리고 네, MSVC에 windows.h 내 생각에 그 중 하나입니다.