2012-04-13 2 views
4

다양한 이미지 형식을로드하는 데 사용되는 ImageLoader라는 클래스를 만들고 있습니다. 다양한 이미지 형식에는 특정 구조체가 사용됩니다. 예를 들어 bmp 파일에는 BITMAPFILEHEADER 구조체와 두 개의 다른 파일이 있습니다.typedef 구조체가 클래스 또는 외부에 선언 되었습니까?

내가 알고 싶은 것은, 클래스 정의를 헤더 파일에 넣을 때 클래스 정의의 struct typedefs를 만들거나 클래스 정의 외부에서 분리시켜야 하는가?

struct 변수를 선언했다면 분명히 클래스에서 발생하지만, 형식을 정의하기 때문에 형식을 정의하는 것이 좋은 디자인으로 간주되는지 잘 모르겠습니다. 클래스 안에서.

+4

왜 C++에서 struct에 typedef를 사용하고 있습니까? 구조체의 이름을 사용할 수 있습니다. –

+0

왜냐하면 전 C에 익숙해 져서 낡은 습관은 많이 죽습니다. – Legion

답변

5

내 일반적인 규칙은 해당 클래스와 함께 사용할 경우 내재적으로 선언한다는 것입니다 (소유권을 의미 함). 그렇지 않으면 별도로 선언하십시오.

0

typedef이 논리적으로 생성하려는 클래스에 속하면 그 안에 넣습니다. 그것이 세계적인 수준에서 의미가 있다면, 그것을 밖으로 둡니다.

3

가능한 경우 헤더에서 모든 것을 제외하면 캡슐화가 향상됩니다. 클래스의 일부 메소드가 구조체의 매개 변수 또는 반환 유형을 필요로하는 경우에도 전달 선언을 사용하지 않을 수 있습니다.

오직 헤더가 퍼블릭 인터페이스의 일부일 때만 입력해야합니다.

클래스에 포함되는지 여부에 관해서는 자체적으로 유용한 지 또는 클래스에 완전히 종속적인지 여부를 고려하십시오. 혼자 서있을 수 있다면 아마도 자신의 헤더에 들어가야합니다.

1

BITMAPFILEHEADER은 Win32 Platform SDK에 정의 된 구조입니다. 나는 그것에 대한 당신의 요구를 이해했는지 확신 할 수 없다 ...

일반적으로 클래스 클라이언트에 노출되지 않는 구조체를 정의한다면, 나는 private 클래스의 일부 또는 헤더 파일에서 서브 네임 스페이스 Details 예에서 :

namespace YourCoolLibrary 
{ 
    namespace Details 
    { 
    struct SomeInternalStructure 
    { 
     ... 
    }; 

    } // namespace Details 


    class YourCoolClass 
    { 
    ... 
    private: 
    Details::SomeInternalStructure m_something; 
    }; 

} // namespace YourCoolLibrary 
+0

그래, Win32에 존재한다는 것은 알고 있지만, 이걸 비 Windows 플랫폼으로 포팅 할 것입니다. 나는 구조체를 재 작성하여 Win32에서 사용되는 방식과 동일하게 사용할 것이다. – Legion

1

에도 많은 선택 사항이 있습니다. 이 클래스를 클래스에 넣으면 public, protected 또는 private 중 하나를 선택하여 클래스 정의를 클래스의 모든 사용자에게 표시되도록하고 파생 클래스 만 또는 다른 클래스는 표시하지 않아야합니다.

클래스 정의의 세부 정보가 필요하지 않은 경우 ImageLoader에 선언을 전달하면 더 간단하게 유지할 수 있습니다. 그런 다음 내부 클래스의 전체 정의가 구현 파일로 이동합니다.

내 어림짐작은 가능한 한 로컬로 이름을 지정하는 것입니다. 따라서 실수로 잘못된 위치에서 사용하면 컴파일러에서 불평 할 것입니다.

2

클래스의 유형을 선언하는 것이 잘못된 디자인의 지표라고 말하지 않습니다. "디자인"에 대한 언급이 "가독성"의 선상에있는 것을 의미한다고 가정 할 때, 나는 일관성을 유지해야하며 동일한 관계가 같은 방식으로 표현되어야한다고 주장합니다.

그렇지 않으면 중첩 유형에 대한 신성한 분노에 시달릴 수 없습니다 (SGI가 거친 분화구가 아님을 고려할 때). 이것은 매우 컨텍스트 중심이므로, 요구 사항에 따라 정의한 바를 제외하면 어렵고 빠른 규칙이 없습니다.

클라이언트 액세스 가능성이 문제가되지 않으면 헤더의 적절한 범위에있는 모든 것을 선언하고 내 코드가 의미하는 바를 문서화합니다. 다시 말하지만, 엄격한 사용법/가독성 가이드 라인을 적용하지 않아도됩니다. 내가 한 경우 Mark의 제안과 함께 갈 것입니다.

2 센트 : 이미지 유형을 열거하고 설정 데이터에 하나의 공개 구조체를 사용하여 닫힌 문 뒤에서 다른 모든 것을 당기는 것을 정당화 할 수 있습니다.

관련 문제