2014-12-12 2 views
1

질문 :
std::vector<unique_ptr<obj>>에 개체를 추가하는 방법은 무엇입니까?

내가 클래스를 가지고 있고, 이것이 내가 아래는
... 할
을 시도하고 무엇을 내가 가장 쉬운 것이라고 생각대로, 나는 나의 벡터에 std::unique_ptr<Ball>를 사용하는 것을 시도하고있다. std :: vector에 객체를 추가하는 방법 <unique_ptr <obj>>?

class Ball { 
public: 
    Ball(float x, float y); 
    std::vector<std::unique_ptr<Ball>> object; 
    // other declarations below... 
}; 


여기에 내가 와 push_back 새로운 요소를 시도하지 오전 :

Ball ball { 0, 0 }; 
for (size_t i { 0 }; i != 50; ++i) { 
ball.object.push_back(new Ball { 0, 0 }); 
//  ^here is the error 
} 

그리고 내가지고있어 오류를 이해하고 더 않는다.
오류 :
error C2664: 'void std::vector<std::unique_ptr<Ball,std::default_delete<_Ty>>,std::allocator<std::unique_ptr<_Ty,std::default_delete<_Ty>>>>::push_back(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : cannot convert argument 1 from 'Ball *' to 'std::unique_ptr<Ball,std::default_delete<_Ty>> &&'

+2

공에는 공이 많이 있습니까? 이상한 디자인입니다. –

+3

'unique_ptr'의 생성자에 인수를 전달하기 위해'emplace_back'을 사용하십시오. –

+0

@remyabel, 고마워, 그게 해결 됐어. –

답변

7

push_back을 사용하는 경우 unique_ptr을 만들어야합니다. 너무 많이 입력하고 오류가 발생하기 쉽기 때문에 emplace_back을 사용하여 볼 오브젝트를 전달할 수 있습니다. C++ 14에서는 make_unique을 사용할 수 있으므로 선호해야합니다. 당신은 당신이 할 수있는 간단한 일을 찾고 말했다 때문에

for (size_t i { 0 }; i != 50; ++i) { 
    ball.balls.emplace_back(new Ball { 0, 0 }); 
} 
+1

'emplace_back'가 벡터의 재 할당을 시도하고 실패해도 포인터를 지우지 않으면 해결책도 오류가 발생하기 쉽습니다. 'emplace_back'을 사용할 때조차 임시 'unique_ptr'을 생성해야합니다. –

3

당신은 vector<unique_ptr<T>>를 둘러싸는 클래스의 소멸자를 호출 할 때이 자동으로 해제되므로 명시 적으로 메모리를 해제 할 필요가 없다 사용하는 경우.

unique_ptr<Ball> 개체를 만들어야하며 직접 Ball*을 전달할 수 없습니다. 가장 좋은 해결책은 std::make_unique<Ball>(0,0)을 사용하는 것입니다.

+0

C++ 14에서는 그렇습니다. –

+0

질문 제목이 본문과 일치하지 않아 제목에 답했습니다. 이제 시체와 일치하도록 제목이 변경되었으므로 질문에 답할 수 없습니다. –

0

는 대신 std::vector<std::unique_ptr<Ball>>std::vector<Ball>를 사용합니다. 포인터 소유의 복잡성을 추가 할 필요가 없습니다.

+0

기술적으로는 UB입니다. 왜냐하면'std :: vector'는 불완전한 타입을 지원하는 것이 보장되지 않았기 때문입니다. –