2013-06-04 40 views
34

Tôi có một đối tượng C++ kiểu ObjectArrayC++ chèn unique_ptr trong bản đồ

typedef map<int64_t, std::unique_ptr<Class1>> ObjectArray; 

cú pháp để tạo ra một unique_ptr đến một đối tượng mới của loại Class1 và chèn nó vào một đối tượng kiểu ObjectArray là gì?

+0

Trang MSDN sau đây có một số thông tin về vấn đề này: http://msdn.microsoft.com/en-us/library/vstudio/hh279676.aspx – yuyang

Trả lời

47

Là một nhận xét đầu tiên, tôi sẽ không gọi nó là ObjectArray nếu đó là bản đồ chứ không phải là một mảng.

Dù sao, bạn có thể chèn đối tượng theo cách này:

ObjectArray myMap; 
myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1()))); 

Hoặc theo cách này:

ObjectArray myMap; 
myMap[0] = std::unique_ptr<Class1>(new Class1()); 

Sự khác biệt giữa hai hình thức là các cựu sẽ thất bại nếu phím 0 đã có mặt trong bản đồ, trong khi bản đồ thứ hai sẽ ghi đè giá trị của nó bằng giá trị mới.

Trong C++ 14, bạn có thể muốn sử dụng std::make_unique() thay vì xây dựng unique_ptr từ biểu thức new. Ví dụ:

myMap[0] = std::make_unique<Class1>(); 
+1

1 cho đầy đủ và trong trẻo. – taocp

+0

@milleniumbug: Đề xuất hay, hãy để tôi thêm nó vào câu trả lời. Cảm ơn bạn –

+1

Một tùy chọn khác là thành viên emplace: myMap.emplace (0, new Class1). Không phải tất cả các thư viện đều hỗ trợ thành viên này. –

34

Nếu bạn muốn thêm con trỏ hiện có để chèn vào bản đồ, bạn sẽ phải sử dụng lệnh std :: move.

Ví dụ:

std::unique_ptr<Class1> classPtr(new Class1); 

myMap.insert(std::make_pair(0,std::move(classPtr))); 
Các vấn đề liên quan