2009-06-11 4 views
4

방금 ​​boost::ptr_vector을 사용하기 시작했습니다. 나는 하나의 클래스 A의 멤버로서 ptr_vector pctr을 가지고 있고 다른 클래스 B가 pctr의 요소를 참조하기를 원합니다. 클래스 B의 객체를 생성하는 동안 포인터를 pctr에 저장하려고합니다.부스트 포인터 컨테이너의 요소에 대한 포인터

포인터 컨테이너는 포인터에 대한 액세스를 허용하지 않으므로 (참조에만 적용) pctr에서 참조 주소를 가져 와서 B 유형의 객체에 저장해야합니다. 그러나 참조 주소를 가져 오는 것 같습니다. 직관력이없는. 거기에 더 나은 대안이 있습니까?

+0

실제로 같은 문제가 있습니다. 내 이전 솔루션 (명시 적 삭제가있는 원시 포인터 벡터)으로 돌아갑니다. 바보, 정말로. – Cookie

+0

@Cookie 사실, 지금까지 (2011) 나는 포인터 컨테이너를 많이 사용 해왔다. 나는 reference_wrapper를 사용한다. 내가 작업하고있는 프로젝트의 위키에서 이것을 설명했다 : http://sourceforge.net/apps/mediawiki/crackpot/index.php?title=Boost_Pointer_Containers –

+0

좋은 지적, 고마워. 여유 시간을 가지면 세 가지 대안 간의 성능 비교가 좋을 것입니다. – Cookie

답변

0

dereferenced iterator의 주소를 취하는 것이 올바른 수행 방법이라고 생각합니다.

iterator it = ... 
T *ptr = &*it; 

그러나 A 개체가 B 개체보다 먼저 삭제되면 포인터가 매달릴 수 있으므로 위험합니다. 따라서 호출자가 개체의 주소를 가져올 수있게 해주는 release 함수는 컨테이너에서 포인터를 제거합니다.

오버 헤드를 지원할 수 있다면 boost::ptr_vector을 스마트 포인터 벡터로 변경하는 것이 좋습니다. std::vector<boost::shared_ptr<T> >.

+0

추가 삽입이 있으면 ptr_vector에 대한 반복기의 주소가 변경되어 유효하지 않게됩니다. –

+0

하지만 -1은 나에게서 나왔습니다 (shared_ptrs의 벡터 사용에 대한 설명이 맞습니다). –

2

부스트 포인터 컨테이너는 포인터를 잘 보호합니다. 확실히, 당신은 그것을 얻을 수있는 참조의 주소를 취하여 그것을 물리 칠 수 있지만 포인터에 매달려서 포인터 컨테이너의 주장의 강도를 희석시킬 수 있음을 인식하십시오 (모든 포인터는 나머지 부분에 달려 있습니다) 코드 정말).

대안이 될 것 같다 :

  • 관심 포인터의 컨테이너 요소를 참조하는 클래스 B 홀드 반복자를 가지고 (물론 보통의 반복자 무효화 규칙은 처리되어야 할 것이다).

  • A가 포인터를 소유하고 있기 때문에 B가 비 소유 약 참조를 보유하기를 원했기 때문에 shared_ptr 컨테이너를 사용하고 weak_ptr을 사용합니다. 성능면에서는 단점이있을 수 있습니다.

+1

그래, 내가 생각하기에 디자인의 근거는 포인터의 소유권이 A와 같기 때문에 B는 포인터가 없어야하지만 pctr 내의 요소에 대한 참조입니다. 즉, B의 선언은 pctr 내의 요소가 항상 존재한다는 사실에 근거해야합니다. –

+0

구문 당 (syntactic sugar)이지만,'reference_wrapper'는 의사가 처방 한 것일 수도 있습니다. http://stackoverflow.com/questions/193703/how-is-tr1referencewrapper-useful –