2011-01-28 34 views
26

Việc thêm bất kỳ thành viên không thể sao chép nào vào một lớp sẽ ngăn chặn việc tạo bản sao và toán tử gán tự động. Tại sao tăng yêu cầu thừa kế để sử dụng noncopyable?tại sao boost :: noncopyable yêu cầu thừa kế

Tôi nghĩ rằng tôi không đơn độc trong sở thích phong cách của tôi cho

class MyUtility : public MyBase 
{ 
    noncopyable guard; 
    ... 
}; 

như trái ngược với

class MyUtility : public MyBase , private noncopyable 
{ 
    ... 
}; 

Dave Abrahams là một chàng trai thông minh, vì vậy ông có thể coi khả năng này. Tôi đang thiếu gì? Thừa kế là gì?

Trả lời

33

sizeof(boost::noncopyable)!=0. Vì vậy, trong trường hợp này, kích thước lớp học của bạn sẽ lớn hơn.

Here bạn có thể đọc về tối ưu hóa cơ sở trống. (xem phần "4.7: Tối ưu hóa thành viên trống").

Chỉnh sửa: Thực tế, không thể sao chép không có nhà xây dựng công cộng làm cho nó vô ích cho bất kỳ mục đích sử dụng nào khác, trong khi các lớp với hàm tạo công khai cũng có thể được sử dụng cho các mục đích sai khác. Đây là một lý do khác, tại sao tăng cường chọn phương pháp này.

+4

bắt buộc tham chiếu đến "Tối ưu hóa cơ sở Empty" phép trình biên dịch cho những người không hiểu câu trả lời :) –

+1

@Matthieu M. Làm xong :). – UmmaGumma

+0

Tôi chấp nhận điều này như là câu trả lời, nhưng nó cũng nên đề cập đến thực tế là cách tiếp cận của boost ngăn cản phân lớp cung cấp một cách rõ ràng chức năng sao chép. –

23

Nếu bạn có thể sử dụng noncopyable làm thành viên, nó sẽ yêu cầu hàm tạo và phá hủy mặc định công khai. Sau đó mọi người có thể tạo ra các thể hiện của noncopyable hoặc thậm chí sử dụng nó như là một lớp cơ sở đa hình mà không có destructor là ảo. Việc triển khai mà không có bất kỳ thành viên công khai nào chỉ đơn giản đảm bảo rằng nó chỉ được sử dụng như một lớp chính sách.

+3

Tôi nghĩ đây là câu trả lời đúng, không phải là câu trả lời về EBO. –

4

Cá nhân, tôi thích cú pháp tăng. Thừa kế là một cách để thêm một số đặc tính hoặc tính năng cho toàn bộ lớp, và không thể đọc được là một tính năng như vậy. Thành viên noncopyable có vẻ khó khăn (bạn thực sự không muốn thêm bất kỳ thành viên, đó là một thủ thuật). Thừa kế được sử dụng chính xác cho những gì nó được thiết kế cho.

4

Lý do rõ ràng nhất là lớp dẫn xuất "isA" không thể đọc được, vì vậy việc sử dụng thừa kế có ý nghĩa nhất. Thực tế là sử dụng nó theo cách này không làm tăng kích thước của lớp cũng là một xem xét ngày hôm nay (nhưng tôi nghĩ noncopiable trước lớp tối ưu hóa cơ sở trống).

+0

Khi nào trình biên dịch xuất hiện các đối tượng lớp dẫn xuất như thể subobject cơ bản là một thành phần con? Dường như với tôi rằng tái sử dụng padding của subobject cơ sở tồn tại trong nhiều thập kỷ (ít nhất một). – curiousguy

0

Nếu bạn bỏ qua các private định, nó trở nên gần giống như tiếng Anh:

// English: this is my car, it is not copyable 
class MyCar: noncopyable {}; 

// my truck is noncopyable, did i mention it's also a vehicle? 
class MyTruck: noncopyable, public MyVehicle {}; 

// My airplane is a vehicle, BTW it's not copyable 
class MyAirplane: public MyVehicle, noncopyable {}; 
Các vấn đề liên quan