c++ - 중첩클래스 - 이 경우 중첩 클래스를 사용해야합니까?




class in class (7)

비디오 재생 및 레코딩에 사용되는 클래스 모음을 만들고 있습니다. play() , stop() , pause() , record() 등의 메서드를 사용하여 공용 인터페이스처럼 작동하는 하나의 기본 클래스가 있습니다. 그런 다음 비디오 디코딩 및 비디오 인코딩을 수행하는 워크 스포 클래스를 사용합니다.

방금 C ++에서 중첩 된 클래스의 존재에 대해 배웠습니다. 프로그래머가이 클래스를 사용하는 것에 대해 어떻게 생각하는지 궁금합니다. 나는 약간의 경계심이 있지만 이점 / 단점이 무엇인지는 확실치 않지만, 내가 읽는 책에 따르면 내 것과 같은 경우에 사용되는 것처럼 보입니다.

이 책에서는 광산과 같은 시나리오에서 인터페이스 클래스 내부에 워크 호스 클래스를 중첩시키는 것이 좋을 것이므로 클라이언트가 사용하지 않을 클래스에 대한 별도의 파일이 없으며 가능한 이름 충돌을 방지 할 수 있다고 제안합니다. 나는 이러한 정당화에 관해 모른다. 중첩 클래스는 새로운 개념입니다. 프로그래머가이 문제에 대해 어떻게 생각하는지보고 싶을뿐입니다.


글쎄, Interface 클래스의 workhorse 클래스에 대한 포인터를 사용하고 인터페이스 메소드의 매개 변수 또는 반환 유형으로 노출시키지 않으면 인터페이스 헤더 파일에 작업 말에 대한 정의를 포함 할 필요가 없습니다. 앞으로 그들을 선언하십시오). 그렇게하면 인터페이스 사용자는 백그라운드에서 수업을 알 필요가 없습니다.

확실히 클래스를 중첩 할 필요는 없습니다. 사실, 별도의 클래스 파일을 사용하면 프로젝트가 커짐에 따라 코드를 훨씬 쉽게 읽고 쉽게 관리 할 수 ​​있습니다. 하위 클래스 (다른 콘텐츠 / 코덱 유형에 대해 말하기)가 필요할 경우 나중에 도움이됩니다.

PIMPL 패턴 (3.1.1 절)에 대한 자세한 내용은 다음과 같습니다.


때로는 사용자로부터 구현 클래스를 숨기는 것이 적절합니다.이 경우 public 클래스 정의보다 foo_internal.h에 넣는 것이 좋습니다. 그렇게하면 foo.h 독자는 문제가되지 않는 것을 원하는대로 볼 수 없지만 인터페이스의 각 구현에 대해 테스트를 작성할 수 있습니다.


염두에 두어야 할 또 다른 사항은 작업 기능 (예 : 디코딩 및 인코딩)의 구현을 구상하는지 여부입니다. 이 경우 함수를 구현하는 다른 구체적인 클래스를 가진 추상 기본 클래스를 원할 것입니다. 각 구현 유형에 대해 별도의 하위 클래스를 중첩하는 것은 실제로 적절하지 않습니다.


외부 클래스의 공용 인터페이스를 사용하여 별도의 클래스로 구현할 수없는 경우에만 내부 클래스를 사용해야합니다. 내부 클래스는 클래스의 크기, 복잡성 및 책임을 늘려 사용하지 않아야합니다.

인코더 / 디코더 클래스는 전략 패턴에 더 잘 맞다고 들립니다.


중첩 된 클래스를 피하는 한 가지 이유는 다른 언어와 함께 사용하기 위해 swig ( http://www.swig.org )로 코드를 래핑하려는 경우입니다. Swig은 현재 중첩 된 클래스에 문제가 있으므로 중첩 된 클래스를 노출하는 라이브러리와 인터페이스하면 정말 고통 스럽습니다.


중첩 클래스를 사용하여 기본 클래스를 구현하는 데 필요한 (작은) 도우미 클래스를 만들 수 있습니다. 또는 예를 들어, 인터페이스 (추상 메소드가있는 클래스)를 정의 할 수 있습니다.

이 경우 중첩 클래스의 가장 큰 단점은이 클래스를 다시 사용하는 것이 어렵다는 것입니다. 아마도 다른 프로젝트에서 VideoDecoder 클래스를 사용하고 싶을 것입니다. VideoPlayer의 중첩 클래스로 만들면이 방법을 우아하게 사용할 수 없습니다.

대신 다른 클래스를 별도의 .h / .cpp 파일에 저장 한 다음 VideoPlayer 클래스에서 사용할 수 있습니다. VideoPlayer의 클라이언트는 이제 VideoPlayer를 선언하는 파일을 포함 할 필요가 있으며 구현 한 방법을 알 필요가 없습니다.








nested-class