2009-10-31 6 views
1

하나의 사용자 정의 유형과 종종 한 번에 화면에 이러한 유형의 인스턴스가 여러 개 있기 때문에 조작되는 유형의 컨테이너가 있습니다.사용자 정의 유형의 컨테이너를 어디에 둘까요?

현재 연결된 원본 파일과이 컨테이너를 보관할 네임 스페이스가있는 헤더가 있지만이를 보관할 별도의 클래스를 만들어야합니까? 컨테이너를 포함하는 클래스와 동일한 헤더 파일에 컨테이너를 넣어야합니까 (물론 클래스 외부에 있습니까?)? 이런 상황에 대한 표준 관행은 무엇입니까?

답변

2

특정 클래스가 해당 클래스의 인터페이스의 일부로 컨테이너를 가질 때마다 한 번 typedef됩니다. 그런 다음 그 클래스를 사용할 필요가있는 누군가는 "FooVec"이 많은 fus없이 Foo의 std :: vector라는 것을 쉽게 알아 냈습니다.

namespace bar 
{ 

typedef std::vector<const Foo> FooVec; 

class CAnotherClass 
{ 
    CAnotherClass(FooVec&) 
    { 
     ... 
    } 
} 

}; 

나 '간단한 일이 : 당연히 문제가 동료가 자신의 클래스에 대한 FooVec을 재정의하는 경우에 제공

namespace bar 
{ 

    typedef std::vector<Foo> FooVec; 

    class CClass 
    { 
     CClass(FooVec&) 
     { 
      ... 
     } 
    }; 
} 

:

그러나, 이것은 불완전한 솔루션입니다, 다음 코드를 고려 이 문제를 해결할 수있는 방법은 네임 스페이스/라이브러리/관련 클래스 그룹 당 약 하나의 공통 포함을 사용하는 것입니다. 따라서 다른 사람이 bar 네임 스페이스의 어떤 것에 typedef를 추가하면, 한 곳에서 모든 것을 가질 수 있습니다. IE는 :

barTypes.h 

namespace bar 
{ 
     typedef std::vector<Foo> FooVec; 
     typedef std::vector<const Foo> FooConstVec; 

} 

클래스의 작은 세트 (즉, 당 네임 스페이스) 당 하나의 헤더로 유지함으로써 당신은 형식 정의로 가득 찬 거대한 파일을하지 않습니다. 그것은 여전히 ​​사용자에게 클래스 인터페이스의 일부인 유형에 대한 좋은 가시성을 제공합니다. 일단이 머리말이 확립되면, 추가 된 typedef를 설정하는 대신 팀에서 규율을 유지하기 만하면됩니다.

빌드 성능에 대해 항문 인 경우이 헤더를 precompiled header의 일부로 갖고 싶을 수도 있습니다.

+0

두 번째 부분은 본질적으로 내가 한 일입니다. 정보 주셔서 감사합니다. 하나의 다른 관련없는 질문, 전역 상수 대 클래스 변수 (invariants)? 클래스 변수가 선호된다고 가정하고 있지만,이 가정에서는 맞습니까? – trikker

+0

가장 선호하는 (나에 의해) 최저 필요한 범위로 값을 제한합니다. IE는 함수에서만 사용되는 경우 함수입니다. 클래스 전반에 걸쳐 사용되는 경우 해당 클래스에 대해 정의하십시오. 기타... –

관련 문제