2014-07-17 8 views
3

unique_ptr의 벡터에 다른 파생 객체를 추가하는 방법은 무엇입니까? 포인터의 벡터와 항목을 다음 기본 포인터를 개체를 만들고 추가 할 수있는 포인터를 전달하지만 make_unique dosn't 포인터를 가져올 및 파생 된 objs 각 유형에 대한 오버로드 된 함수를 만들고 싶지 않아.unique_ptr의 벡터에 파생 된 객체를 추가하는 방법

가 질문을 후속 ----------------------------------

class Base{...}; 

class Item:public Base{...}; 

Add_Item(Base* thing) 
{ 
    vec.push_back(thing); 
} 

//Problem with this is i have multiple derived objs and would rather have 1 Add_Item instead of multiple Add_Item functions.(if possible) 
Add_Item(Item thing) 
{ //this runs,but i lose anything that was in Item class 
    vec.push_back(make_unique<Base>(thing)); 
} 

/당신은 unique_ptr의 벡터를 다른 벡터 안에 가질 수 있습니까? 나는이 방법을 시도했다. (두 가지 방법으로 템플릿 Add_Item 함수와 Item Add_Item 함수로 나를 보여줬다.) 그러나 둘 다 오류를 생성했습니다.

class Item: public Item 
{ vector<unique_ptr<Base>>inv } 

Item bag; 
Item n_bag; 
bag.Add_Item<I>(n_bag); 

최대, 아니 당신은 캔트의 std::make_unique() 도우미 함수는 지정된 형태의 새로운 객체를 생성

+0

도움을 주셔서 감사합니다. 다음 질문을 따르십시오. unique_ptr의 벡터를 unique_ptr의 다른 벡터 안에 포함시킬 수 있습니까? – user3085497

답변

0

사용하는 스마트 포인터의 종류에 대해 어떤 권고를 따르라. 귀하의 경우 이것은 Base 개체이며 원하는 것은 아닙니다.

대신 수동으로이 std::unique_ptr를 원하는 구성 할 수 있습니다 :

vec.push_back(std::unique_ptr<Base>(new Item(thing))); 

이것은 새로운 Item 만들고, 그에서 unique_ptr<Base>를 구축합니다.

은 다른 방법도 간단 unique_ptr<Item> 만들고 벡터에 추가 할 때 암시 적 변환 기본 포인터로 변환 할 수 있습니다 :

vec.push_back(std::make_unique<Item>(thing)); 
5

unique_ptr<T> 다른 유형의 unique_ptr<U>에서 이동하는 생성자가 U 두 번째 유형에 대한 포인터가 암시 적으로 첫 번째 유형에 대한 포인터로 변환 가능하고 U이 배열 유형이 아닌 한. 따라서 vec.push_back(make_unique<Item>(thing));을 사용하십시오. demo을 참조하십시오.

사용하는 템플릿 Base에서 파생 된 모든 것을 수락하려면 : D 만약

template <typename D> 
void AddItem(const D& thing) { 
    vec.push_back(make_unique<D>(thing)); 
} 

Base에서 파생되지 않습니다, 당신은 push_back에서 컴파일 오류가 발생합니다.

+0

+1하지만 당연히 C++ 11의 일부가 아닌'std :: make_unique'가 필요합니다. –

+0

@ Cheersandhth.-Alf 글쎄요, OP가 코드에서 사용 했으므로 사용할 수 있다고 생각합니다. –

+2

@TC 응답은 명확한 설명이 포함 된 경우, 즉 명시 적으로 명시된 가정이 더 나은 경우 (컨설턴트가 말한 것처럼) 더 좋을 것입니다. –

2

AddItem() 메서드를 템플릿 메서드로 만들므로 파생 클래스마다 다른 함수를 작성할 필요가 없습니다. 기존 구현 수정 :

관련 문제