2013-11-01 2 views
1

unique_ptr의 일치하는 벡터가 두 개 있습니다. 나는 두 개의 구조체를 포함하는 하나의 벡터를 만들어 통일하기로 결정했다. 구조체는 다른 아이템도 포함 할 것이고 결국은이 리팩터링을 포함 할 것이다.unique_ptr을 포함하는 구조체 항목을 stl 컨테이너에 추가

이 벡터에 새 항목을 추가하는 가장 좋은 방법은 무엇입니까?

내 현재 코드는 unique_ptr 문제를 일으키는 물론

std::vector<DestinationObjects> destinations; 
for (unsigned short &id: ids) { 
    DestinationObjects d; 

    d.transmitter = unique_ptr<Transmitter> (new Transmitter(id)); 
    d.controller = unique_ptr<Controller> (new Controller(id)); 

    destinations.push_back(d); 
} 

이 복사 d입니다. 이것을 고치는 가장 좋은 방법은 무엇입니까? 나는 확실하지 않다 일부는 내가 상상할 수

옵션은 작동합니다

  1. 그냥 shared_ptr로 전환합니다. (간단한 찾기 - 바꾸기가 가능하지만 경찰관처럼 느껴짐).
  2. unique_ptr을 이동하는 구조체의 이동 생성자를 작성하십시오. (구조체를 확장 할 때 유지 관리해야 할 또 다른 문제는 잘못 될 수 있습니다.)
  3. unique_ptr에 대해 null 포인터가있는 빈 struct 인스턴스를 푸시하고 벡터에서 한 번 편집합니다. (Fiddly 문법.이 또한 작동할지 모르겠습니다.)

다른 아이디어는 무엇입니까? 아니면 내가 왜 나열된 것들 중 하나를 선호해야합니까?

+1

'unique_ptr'과 관련하여 어떤 문제가 발생한다고 생각하십니까? – Oswald

+4

암시 적 이동 생성자는 어떤 이유로 든 자신의 복사본 생성자를 작성하여 죽이지 않는 한 괜찮습니다. 왜냐하면'vector'는 객체를 재할 당할 때 객체를 움직일 필요가 있기 때문에 타입은 움직일 수 있어야합니다. –

+4

그냥 ... 옮기시겠습니까? 또는 상사와 emplace_back과 같은 생성자를 얻으십시오. –

답변

1

Simpley do a vec.emplace_back(std::move(d)).

컴파일러에서 암시 적 이동 구성자를 구현하지 않은 경우 사용자 고유의 move 생성자를 작성하십시오. 미래에 내 조언은 당신이 C++ 11 기능에 문제가있을 때마다, "C++ 11 지원"이 될 수있는 좋은 기회가 있기 때문에이 컴파일러를 사용하고 있다고 언급하면서 질문합니다. 중요한 문제.

컴파일러에서 이동 생성자를 전혀 지원하지 않는 경우 unique_ptr을 사용하지 마십시오. move 생성자가 없으면 오히려 쓸모가 없습니다. ;)

관련 문제