2011-09-30 51 views
5

Tôi hơi bối rối khi sử dụng "quy tắc ba" với con trỏ thông minh. Nếu tôi có một lớp mà chỉ có thành viên dữ liệu là một con trỏ thông minh, tôi có cần xác định rõ ràng destructor, constructor sao chép và toán tử gán không?Quy tắc ba với con trỏ thông minh?

Sự hiểu biết của tôi là vì con trỏ thông minh sẽ xử lý tài nguyên tự động, sau đó tôi không cần xác định rõ ràng hàm hủy và do đó tôi không cần phải làm như vậy cho hai loại kia dựa trên quy tắc ba. Tuy nhiên, tôi không chắc liệu hàm tạo bản sao mặc định có đủ tốt cho các con trỏ thông minh như shared_ptr hay không.

Cảm ơn sự giúp đỡ của bạn!

+0

EXP0, bạn nên làm rõ hơn loại con trỏ thông minh nào bạn sử dụng. Có một cái gì đó như std :: auto_ptr, hoặc nhiều hơn như tăng :: shared_ptr <>? – Lev

Trả lời

10

Trình phá hủy mặc định là tốt, bởi vì hàm hủy của shared_ptr sẽ xử lý sự phân bổ của đối tượng. Nhà xây dựng bản sao mặc định có thể được chấp nhận tùy thuộc vào mục đích của bạn: khi bạn sao chép đối tượng sở hữu shared_ptr, bản sao sẽ chia sẻ quyền sở hữu với bản gốc. Điều tương tự cũng đúng với toán tử gán mặc định. Nếu đó không phải là những gì bạn muốn, hãy xác định một hàm tạo bản sao, nếu không, ví dụ, sao chép đối tượng được tham chiếu.

+1

Bạn cũng có thể muốn ghi đè toán tử gán.Di chuyển cấu trúc/chuyển nhượng nên được tốt –

1

Nguyên tắc của ba thực sự nói:

Nếu bạn cần phải xác định một phiên bản không tầm thường của bất kỳ những điều sau đây:

  1. Destructor
  2. Phân Operator
  3. Sao chép Constructor

... thì bạn có thể là nee d hai người kia là tốt.

Bạn dường như được giải thích nó như:

Nếu bạn cần một destructor không tầm thường thì bạn cũng cần hai người kia.

Nhưng điều đó không hoàn toàn giống nhau, phải không?

2

Tóm lại, "không". Toàn bộ điểm của mã bao thanh toán trong các lớp trách nhiệm đơn là bạn có thể soạn các lớp của bạn từ các khối xây dựng "thông minh" để bạn không phải viết bất kỳ mã nào cả.

xem xét như sau:

class Foo 
{ 
    std::shared_ptr<Bar> m_pbar; 
    std::string   m_id; 
}; 

lớp này sẽ tự động có sao chép và di chuyển nhà thầu và sao chép và di chuyển các toán tử gán được tốt như họ có thể nhận được, và tất cả mọi thứ được đưa về chăm sóc.

Nếu bạn muốn trở thành cực đoan, bạn có thể nói rằng trong nhất trường hợp, bạn nên có lẽ không bao giờ được viết một destructor hoặc copy constructor ở tất cả - và nếu bạn làm thế, thì có lẽ bạn nên yếu tố tốt nhất mà chức năng vào một lớp học riêng biệt với một trách nhiệm duy nhất.

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