2012-04-25 2 views
0

현재 프로젝트에서 boost::ptr_vector을 사용하려고 시도하고 있으며 push_back() 메서드에서 매개 변수화 된 생성자를 사용할 수 있는지 궁금하거나 기본 생성자를 사용해야합니까?boost :: ptr_vector 생성자

2 차 질문으로 정의하면 기본 생성자가 계속 사용됩니까?


최선의 후속하지 않을 수도 있습니다,하지만 난 boost::ptr_vector으로 본 구현의 대부분은 push_back() 방법은 new 연산자를 취 것으로 나타났다. 개체를 만든 다음 해당 개체의 포인터를 컨테이너의 push_back() 메서드에 제공 할 수 있습니까?

답변

2

표준 벡터 또는 컨테이너와 매우 유사한 ptr_vector 또는 어떤 ptr_container을 사용하기위한 것입니다. 생성자가 정의되어있는 한 원하는 모든 생성자를 사용할 수 있습니다 (기본값도 작동합니다). 유일하게 실제적인 차이점은 ptr_container이 정적 개체 대신 포인터를 사용하고 얕은 복사본에 가깝게 딥 복사로 작동하는 복제를 지원한다는 것입니다.

후속 조치. 이다 push_back() 방법으로 기존 객체를 사용할 수있다 :

#include <boost/ptr_container/ptr_vector.hpp> 
#include <vector> 
typedef boost::ptr_vector<Base> thing; 
void foo(void){ 
    thing Bar; 
    Object * newObj = new Object(param1, param2); 
    bar.push_back(newObj); 
} 

배열에 배치 할 객체의 포인터에 저장된 정보를 사용하려고 시도 것으로 보인다. 이 경우 정적 객체를 제공 할 수 있습니다. 비록 어떤 이유로 (포인터 컨테이너의 라인을 따르는 무언가가 유일한 아이템/포인터에 실제로 사용 되어야만하는) 정적 오브젝트를주는 것을 고려할 때 이것은 이상한 느낌을줍니다.

+0

ptr_vector는 일반 벡터와 마찬가지로 포함 된 객체입니다. (ptr_vectors의 포인트는 포인터를 저장하지만 실제 객체를 포함하는 벡터의 의미를 제공하는 것입니다.) 그래서 거기에 정적 객체에 대한 포인터를 저장하는 것은 좋은 생각이 아닙니다. –

+0

@davidschwartz는 테스트를 수행했습니다. 적절한 유형의'정적 '객체를'ptr_vector'에 넣으려고 시도했지만, 참조 또는 참조 취소를 수행 할 수 없습니다. 결론 :'static'객체를'ptr_vector '에 배치하려고 시도하는 것은 불법이며,'ptr_container'도 가능합니다. – gardian06

관련 문제