2013-11-05 2 views
3

저는 새로운 프로그래머입니다. 다른 클래스 중 하나와 밀접하게 관련된 몇 가지 (2-4) 작은 펑터 클래스를 만들어야 할 상황에 처했습니다. 기본 클래스는 GraphicsRenderer라고하며 기본적으로 단일 컴파일 단위 내에서 모든 OpenGL API 호출을 완전히 캡슐화하는 OpenGL을 감싸는 래퍼입니다. 모든 Functor는 GraphicsRenderer 클래스를 지원하기 위해 존재하기 때문에 필자는 GraphicsRenderer.h 헤더 파일 내에서 ..여러 개의 작은 펑터 클래스에 대한 공유 헤더 파일?

나는 '규칙'은 일반적으로 헤더 파일 당 단 하나의 클래스 선언을 가지고 있다는 것을 알고있다 .. 그래서 나는 어디에서 펑터를 선언해야 하는가 ..?

  • 각 펑터 클래스에 대해 .h 및 .cpp 파일을 별도로 만드시겠습니까? (모두 API 호출을 포함해야합니다.)

  • GraphicsRenderer 클래스와 동일한 파일에서 모든 Functor 클래스를 선언하거나 정의합니까? (모든 API 호출을 동일한 컴파일 단위로 유지합니다.)

  • 또는 네임 스페이스에 적합한 곳입니까? 중첩 클래스 선언 (예 : GraphicsRenderer 클래스 선언 내에서 Deleter 펑터 선언)은 어떻게됩니까?

답변

2

외에도 적은 수의 파일을 가지고에서 별도의 .h/.cpp 파일에 각 클래스를 유지에서 많은 손실되지 않습니다. 한 파일 당 하나의 클래스를 갖는 것이 좋습니다.

그렇다고해도 헤더 파일을 다른 모든 .h 파일을 포함하는 하나의 공통 헤더로 결합하여 API 사용자가 더 편리하게 사용할 수 있습니다. GraphicsRenderer을 펑터에서만 사용할 수 있다고 가정하면 .h 파일을 GraphicsRenderer'h 헤더 파일에 포함시킬 수도 있습니다.

네임 스페이스의 경우 다른 팀마다 서로 다른 규칙이 있습니다. 나는 API 충돌을 막기 위해 네임 스페이스를 사용하는 것을 선호한다 - 나는 보통 응집력있는 API의 넓은 영역에 대해 단일 네임 스페이스를 유지한다. 나는 다른 팀이 클래스 당 거의 하나의 네임 스페이스만큼 극단적 인 것을 보았다.

1

당신의 펑 템플릿하지 않은 경우,이처럼 .H 파일에 인터페이스를 선언

파일 .H : 구현을위한

class GraphicsRenderer { 
    void someApiCall(); 
    void someOtherApiCall(); 
}; 

파일 .CPP :

#include <GL.h> 

GraphicsRenderer::SomeApiCall() { 
    //Implementation goes here. 
} 

함께 사용하기에 충분하고 크기가 작은 경우 하나의 헤더 파일에 일부 클래스를 패키징해도 문제가 없습니다. 예를 들어 stl 라이브러리에는 클래스 모음이있는 utility 헤더가 있습니다.

그러나 때문에, 인라인 함수를 구현하는 .cpp 파일에 구현 가능한 경우 forward declarations를 사용하여, 최대한 .H 파일에 #include의 제거하지 않는, 가능한 한 분리 등의 구현과 인터페이스를 유지한다. 이것은 또한 컴파일 시간을 향상시킵니다. 당신이 템플릿을 사용할 때

예외

이지만, 그렇게하더라도, 나는 당신이 이런 식으로 파일을 분할하는 것이 좋습니다 :

을을 MyFile에서.H 파일 : 구현

template <class T> 
class MyClass { 
public: 
    template <class U> 
    void apiCall(U u); 
}; 

#include "MyFilePriv.h" 

MyFilePriv.h :

템플릿은 별도의 컴파일 될 운명되지 않은 경우에도
template <class T> 
template <class U> 
MyClass<T>::apiCall(U u) { 
    //Implementation goes here. 
} 

는,이 인터페이스 파일을 읽을 훨씬 쉬워을하고 아직 구현 세부 사항을 숨 깁니다, 최소한 개발자들에게.