2010-12-15 7 views
4

나는 C++ 프로젝트에서 헤더 결합을 줄이는 간단한 방법을 찾고 있는데, 이것은 대부분 완전한 유형을 요구하는 (과용 된) 클래스 구성 때문이다. 예를 들어 :자동 인스턴스화 된 스마트 포인터

// header A 
class A 
{ 
    B b; // requires header B 
}; 

또한 인터페이스와 pimpl을 고려,하지만 모두 내가 수동/쓰기 지원하지 않는 일부 상용구 코드 의미 (또는이이 자동 만들 수있는 방법을?).

그래서 멤버를 대체하고 포인터와 전치환을 class B* pB;처럼 바꾸는 것을 생각했지만 개체 생성 및 삭제 처리가 필요합니다. 좋아, 내가 삭제에 대한 스마트 포인터를 사용할 수 (auto_ptr 아니지만 창조에서 완전한 유형이 필요하므로 shared_ptr<class B> pB; 같은 말),하지만 어떻게 지금 개체 생성과 함께 있을까?

pB = new B;과 같은 A의 생성자에 개체를 만들 수 있습니다.하지만 이것은 수동이며, 더 나쁜 것은 몇 가지 생성자가있을 수 있습니다 ... 자동으로 처리하는 방법을 찾고 있습니다. pB 인스턴스화에 신경 쓸 필요없이 A의 정의에서 B b;autoobjptr<class B> pB;으로 변경하는 것만 큼 간단합니다.

저는 이것이 새로운 아이디어가 아니므로 일반적인 해결책이나 토론에 대한 참고 자료를 줄 수있을 것이라고 확신합니까?

UPDATE :가 나는 AB 사이의 의존성을 깨려고하고 있지 않다, 그러나의 하나 '하나 A을 포함 할 때의 헤더'나는 B의 포함을 피하려고 명확합니다. 실제로는 BA의 구현에 사용되므로 일반적인 해결책은 A에 대한 인터페이스 나 핌플을 만드는 것이지만 좀 더 쉽게 찾고 있습니다.

UPDATE2 : 갑자기 here 트릭을 할 것이라고 제안 같은 게으른 포인터, 가상 소멸자와 결합 될 때 (불완전 유형을 허용하는) (너무 나쁜이의의 표준 구현이 향상 말도있다) 것을 깨달았다. 그것은 나를했다하지만,가 갑자기 세르게이 Tachenov은 매우 간단한 솔루션 (허용 대답)와 함께 : 나는 아직도

갱신 3에게 ... 표준 솔루션이없는 이유 얻고 다시 발명 바퀴처럼 생각하지 않습니다 왜 그것이 실제로 작동 하는지를 이해하는 데 30 분 ... A() 생성자를 제거하거나 헤더 파일에서 인라인으로 정의하면 마법이 더 이상 작동하지 않습니다 (compliation error). 명시 적으로 비 인라인 생성자를 정의하면 구성원 (심지어 암시 적 생성자)의 생성은 유형이 B 인 동일한 컴파일 단위 (A.cpp)에서 수행됩니다. 반면에 A 생성자가 인라인 인 경우 다른 컴파일 단위 내에서 멤버를 만들어야하며 B이 불완전하기 때문에 작동하지 않습니다. 글쎄, 이것은 논리적이지만, 지금은 궁금하다 - C++ 표준에 의해 정의 된 동작인가?

업데이트 4 : 잘하면, 최종 업데이트. 위의 질문에 대한 토론은 수락 된 대답과 의견을 참조하십시오.

답변

관련 문제