Tôi có lớp foo
có chứa một thành viên std :: auto_ptr mà tôi muốn sao chép cấu trúc nhưng điều này dường như không được phép. Có một điều tương tự cho nhiệm vụ. Xem ví dụ sau:Làm thế nào để sử dụng một std :: auto_ptr trong một lớp học bạn phải sao chép xây dựng?
struct foo
{
private:
int _a;
std::string _b;
std::auto_ptr<bar> _c;
public:
foo(const foo& rhs)
: _a(rhs._a)
, _b(rhs._b)
, _c(rhs._c)
// error: Cannot mutate rhs._c to give up ownership - D'Oh!
{
}
foo& operator=(const foo& rhs)
{
_a = rhs._a;
_b = rhs._b;
_c = rhs._c;
// error: Same problem again.
}
};
Tôi chỉ có thể tuyên bố _c
như mutable
nhưng tôi không chắc chắn điều này là đúng. Có ai có một giải pháp tốt hơn?
EDIT
OK, tôi không nhận được các loại câu trả lời mà tôi đã mong đợi vì vậy tôi sẽ có một chút cụ thể hơn về vấn đề này.
- Một đối tượng kiểu
foo
được tạo trên ngăn xếp và được chuyển theo giá trị vào một lớp chứa (không phải stl) và sau đó nằm ngoài phạm vi. Tôi không có quyền kiểm soát mã vùng chứa. (Nó thực sự là một hoạt động xếp hàng đang hoạt động, có lỗi.) - Lớp
bar
là một trình phân tích cú pháp khá nặng. Nó có hiệu suất rất kém trênnew
vàdelete
vì vậy ngay cả khi nó là bản sao có thể xây dựng, nó sẽ là quá đắt. - Chúng tôi có thể đảm bảo rằng khi đối tượng
bar
được tạo, nó sẽ chỉ cần được sở hữu ở 1 địa điểm cùng một lúc. Trong trường hợp này nó đang được truyền giữa các luồng và bị xóa khi giao dịch được hoàn tất. Đây là lý do tại sao tôi đã hy vọng sử dụng mộtstd::autp_ptr
. - Tôi rất sẵn lòng cân nhắc việc tăng các con trỏ thông minh nhưng tôi hy vọng sẽ đảm bảo tính duy nhất này nếu có sự thay thế.
Vẫn là câu trả lời hay nhất ngay cả sau khi chỉnh sửa. foo sẽ cần phải sao chép hoặc chia sẻ thanh và auto_ptr không chia sẻ tốt. Vì việc sao chép hiện bị loại trừ, bạn sẽ cần shared_ptr. –
MSalters