2015-09-24 41 views
11

Tôi có một lớp foo, với một thành viên bar loại std::shared_ptr<int>:Gán cho một thành viên biến std :: shared_ptr

class foo 
{ 
    std::shared_ptr<int> bar; 
    /*other stuff here*/ 
}; 

Trong lớp mà tôi muốn gán một new int-bar. Nhưng tôi không thể viết bar = new int(); vì con trỏ không có toán tử gán công khai.

Cách nên Tôi làm điều này? Tôi có thể std::move hoặc std::swap nhưng không ai trong số đó có vẻ đúng.

Trả lời

10

Bạn có thể sử dụng reset cho việc này:

bar.reset(new int()); 

này sẽ delete các nội dung hiện tại (nếu có) và thiết lập các con trỏ nội bộ để mà trả về bởi sự biểu hiện new.

13

bar = std::make_shared<int>(); là một cách, đặc biệt là nếu bạn muốn giữ lại tính dễ di chuyển của toán tử gán.

+0

Đã xem chỉnh sửa của bạn. Liệu thay đổi đó vẫn khởi tạo 'int' thành 0? 'new int()' sẽ, 'new int' sẽ không. – Bathsheba

+2

'std :: make_shared (new int())' không hợp lệ; 'make_shared' hoàn toàn chuyển tiếp các đối số tới hàm tạo' T'. Nó được chỉ định để xây dựng đối tượng bằng cách sử dụng ':: new (pv) T (std :: forward (args) ...)' vì vậy nếu không có args, nó sẽ được khởi tạo giá trị. – TartanLlama

+1

@Bathsheba: Đúng vậy, không có các biểu mẫu "chưa được khởi tạo" của bất kỳ hàm 'make_ *' nào. Tôi nghĩ rằng một cái gì đó như thế đã được đề xuất một lần (như một phần của đề xuất cho phép các loại mảng có kích thước cho make_ {shared, unique}) và đề xuất đi kèm với biểu mẫu make _ * _ uninitialized sử dụng khởi tạo mặc định. Nói chung, thư viện chuẩn khiến cho việc tạo ra các giá trị chưa được khởi tạo rất khó, mặc dù đôi khi đó là những gì bạn cần ... –

Các vấn đề liên quan