2011-07-26 1 views
3

나는 class.cppclass.h에 정의 된 클래스가 있습니다. 클래스는 private 멤버 및 메서드에 대해 stuff.h (물론 stuff.cpp)에 정의 된 몇 가지 구조/클래스/형식/모든 것을 사용합니다. 내 주 프로그램은 main.cpp이며, #includeclass.h이지만, 무엇이든 상관하지 않습니다. stuff.h. 차이가 나는 경우 class.cp이 동적으로로드됩니다 (.dll/.so).
나는 단지 을 과 stuff.cpp에 포함시키는 것이 이상적입니다. 단지 main.cpp에 네임 스페이스 오염을 일으키고 최종 프로그램에 링크 됨으로써 여분의 팽창을 유발하기 때문입니다.
문제는 class.hprivate: 부분에 정의가 사용되었으므로 stuff.hclass.h에 포함시켜야한다는 것입니다. main.cppclass.h을 가져오고 이후로는 stuff.h이됩니다!개인 데이터 용 헤더 만 .h 파일에 포함합니다.

이 부분이 분명해졌습니다. C#에서는 부분 클래스로 해결할 수 있습니다. 어떻게하면 C++에서이 작업을 수행 할 수 있습니까?

+0

'main.cpp'에 포함 된'stuff.h '의 기호 또는 실제 정의가 걱정 되십니까? 의미 -'stuff.h'의 심볼에 대해서만 forward 선언을하면'main.cpp'에서 여전히 문제가 발생합니까? –

+0

@ eli-iser 전달 선언이란 무엇입니까? – baruch

+0

Soren과 ks1322에서 설명했듯이,'class Stuff'를 가지고 있다면'class stuff '을 사용하여'#include'stuff.h'없이'class.h'에서 사용할 수 있습니다. 이것은'class.h '가'# include'없이'Stuff' 클래스를 인식하도록 enalbe합니다. –

답변

2

당신은 C++에서 pImpl aka Opaque Pointers을 사용합니다. 여기서 노출하는 클래스는 부분적으로 정의 된 구조체 인 하나의 속성 만 갖습니다. (때로는 사람들이 void *를 대신 사용하지만 같은 효과가 나타납니다.)

부분적으로 정의 된 구조체는 stuff.cpp 내부에서 완전히 정의되며 예상대로 작동합니다. 생성자 및 소멸자가 내부 구현을 삭제하는지 확인해야합니다. 복사 생성자와 할당 연산자 operator=에 특수 조항을 만드십시오. 대부분의 사람들은 복사 생성자와 할당 연산자를 private으로 설정하여 컴파일러가 사용되면이를 반대합니다.

+0

스마트 포인터로 핌플을 할 수 있고 개인 구현의 건설/파괴와 관련된 문제를 없앨 수 있습니다. –

+0

@Marthinho, 흥미로운 제안, 참조 할 수있는 예가 있습니까? – Soren

+0

부스트 문서에는 다음과 같은 예가 있습니다. http://www.boost.org/doc/libs/1_47_0/libs/smart_ptr/sp_techniques.html#pimpl (그 페이지는 다른 보석으로 가득합니다.) –

0

여기에 Pimpl Idiom이 필요합니다. Pimpl의 주요 아이디어는 정의를 포함하는 대신 구현 클래스를 선언하는 것입니다. 이렇게하면 헤더 파일의 구현 종속성을 제거 할 수 있습니다. 특히 대용량 프로젝트의 경우 컴파일 속도가 빨라집니다.

관련 문제