2016-08-15 3 views
-3
class element 
{ 
public: 
    element(); 
    virtual void foo() = 0; 
}; 

class bar : public element 
{ 
public: 
    bar(); 
    void foo() override 
    { 
     // Stuff 
    } 
}; 

class baz : public element 
{ 
public: 
    bar(); 
    void foo() override 
    { 
     // Stuff 
    } 
}; 

bar의 인스턴스와 baz의 인스턴스를 같은 벡터 나리스트에 저장하고 싶습니다.추상적 인 객체의 인스턴스 저장하기

위의 코드는 작동하지만이 종류의 구조를 가진 것이 내가 찾고있는 것입니다.

unique_ptr< element> 벡터를 저장할 수있는 곳을 읽었지 만 bar 또는 baz의 인스턴스를 요소의 고유 포인터로 변환하는 방법을 알 수 없습니다.

죄송합니다. 중복되는 경우 해결책을 찾으려고했지만 아무 것도 찾을 수 없습니다.

+1

* * ['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr) 개체를 만드는 방법을 알고 있습니까? 거기에서 시작하여 벡터에 어떻게 저장 될지 생각해보십시오. –

+0

[this] (http://stackoverflow.com/questions/17417848/stdunique-ptr-with-derived-class) 질문에 대한 답변 : –

+0

여기에서 누락 된 주요 사항은 상속 및 다형성을 사용하는 방법이라고 생각합니다. , 예. 다형성 처리를 원한다면 기본 클래스에 대한 포인터 또는 참조를 사용하여 파생 클래스를 가리키거나 참조해야한다는 사실. 'std :: unique_ptr'를 사용하여 객체를 유지하는 방법에 대한 세부 사항은 첫 번째 점 이후에만옵니다. –

답변

2

std::make_unique을 사용하면 unique_ptr에 의해 관리되는 개체를 만들 수 있습니다.

std::vector<std::unique_ptr<element>> vector; // Empty vector 

vector.push_back(std::make_unique<bar>()); // Push a new bar 
vector.push_back(std::make_unique<baz>()); // Push a new baz 
+0

이미 bar 또는 baz 인스턴스가있는 경우 어떻게됩니까? 새 인스턴스를 만들어야합니까? –

+0

@ConradJLudgate 예. 인스턴스는 한 곳에서만 존재할 수 있으므로 인스턴스를 복사 (또는 이동)해야합니다. 'make_unique'는 새로운 인스턴스의 생성자에 인수를 전달하기 때문에'std :: make_unique (a)'를 사용하여'a' (resp. std :: move (a))에서 새로운' '이동 - 건설). – Quentin

관련 문제