2009-09-17 35 views
5

Có cách nào sử dụng STL containters với các phần tử không thể sao chép không?Cách tạo vùng chứa các phần tử không thể sao chép

một cái gì đó như thế này:

class noncopyable 
{ 
    noncopyable(noncopyable&); 
    const noncopyable& operator=(noncopyable&); 
public: 
    noncopyable(){}; 
}; 

int main() 
{ 
    list<noncopyable> MyList; //error C2248: 'noncopyable::noncopyable' : cannot access private member declared in class 'noncopyable' 
} 

Trả lời

15

Không, các phần tử không thể sao chép không được nằm trong các lớp chứa C++.

Theo tiêu chuẩn, 23,1 khoản 3, "Các loại của các đối tượng được lưu trữ trong các thành phần này phải đáp ứng được yêu cầu của CopyConstructible loại (20.1.3), và các yêu cầu bổ sung của Assignable loại."

+0

Điểm tốt! std :: unique_ptr có thể là một lựa chọn cho anh ta nếu anh ta sử dụng một trình biên dịch khá mới với C++ STL mới. – jdehaan

+0

Tôi phải giải quyết vấn đề của mình bằng cách loại bỏ nhu cầu sao chép sâu phức tạp của đối tượng. Tôi đã chọn câu trả lời này vì nó trả lời câu hỏi của tôi trực tiếp. Nhưng một trong những khác là tốt quá! – Vargas

+1

Nếu đây là những yêu cầu, tại sao có thể lưu trữ một unique_ptr trong một vector hoặc danh sách? unique_ptr không phải là copy-constructible. –

15

Một lựa chọn là để tạo ra một danh sách các con trỏ đến các yếu tố (tốt một shared_ptr). Đây không phải là chính xác những gì bạn muốn nhưng nó sẽ hoàn thành công việc.

+2

+1, nhiều hơn hoặc ít hơn tùy chọn duy nhất, vì IIRC 'std :: list' yêu cầu các phần tử có thể sao chép được. –

+0

Đó là chính xác những gì tôi đang cố gắng tránh, tôi muốn gọi MyList.clear() đôi khi và tôi cần rằng destructor cho noncopyable được gọi. – Vargas

+0

Yup - tiêu chuẩn cho biết: "Loại đối tượng được lưu trữ trong các thành phần này phải đáp ứng các yêu cầu của loại CopyConstructible (20.1.3) và các yêu cầu bổ sung của loại có thể gán". –

2

Tùy chọn khác là sử dụng Boost Pointer Container library. Điều này hoạt động giống như một container tiêu chuẩn của std :: auto_ptrs sẽ, là một điều như vậy có thể: nó giữ quyền sở hữu độc quyền của các yếu tố của nó, và nó không thể được sao chép. Nó cũng có ít chi phí hơn so với một container tiêu chuẩn của shared_ptrs.

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