2013-09-21 35 views
15
class A 
{ 
public: 
    A() = default; 
    A(const A&) = delete; 
}; 

class A 
{ 
public: 
    A() = default; 

private: 
    A(const A&) = delete; 
}; 

Hai định nghĩa này có luôn giống hệt nhau trong mọi trường hợp không?Phải là người xây dựng đã bị xóa riêng tư?

+9

Tôi đặt các chức năng đã xóa của mình ở chế độ công khai, vì đó là ** thông báo ** cho người dùng công khai rằng nó không thể được tạo mặc định (trong trường hợp của bạn). – Nawaz

Trả lời

26

Chúng khác nhau chỉ ghi lại chẩn đoán được sản xuất. Nếu bạn thực hiện nó private, một vi phạm truy cập bổ sung và không cần thiết được báo cáo:

class A 
{ 
public: 
    A() = default; 
private: 
    A(const A&) = delete; 
}; 

int main() 
{ 
    A a; 
    A a2=a; 
} 

kết quả trong những điều sau thêm đầu ra từ GCC 4.8:

main.cpp: In function 'int main()': 
main.cpp:6:5: error: 'A::A(const A&)' is private 
    A(const A&) = delete; 
    ^
main.cpp:12:10: error: within this context 
    A a2=a; 
     ^

phương pháp do đó đề nghị của tôi để luôn luôn đảm xóa public .

+5

+1. Tôi làm cho các chức năng của tôi bị xóa công khai, bởi vì nó là ** một thông báo ** cho người dùng công khai rằng nó không thể được xây dựng mặc định (trong trường hợp của OP). – Nawaz

+3

@Nawaz Quyền, do đó nó cũng có thể được coi là một phần của giao diện/tài liệu của lớp. –

2

Tôi muốn gia hạn Daniel Frey's answer. Thay vì thực hiện các phương thức đã xóa luôn luônpublic, tôi muốn cung cấp các phương thức này cho công cụ sửa đổi truy cập bạn (giả thiết) cung cấp các phương pháp này nếu chúng không bị xóa. (Tôi không thích luôn trong trường hợp một lập trình viên có một lựa chọn. Nếu nó sẽ thực sự được tạc bằng đá để làm cho các phương pháp xóa public, nó phải được thực thi bởi ngôn ngữ riêng của mình.)

Một số quy tắc của ngón tay cái/hướng dẫn :

  • Sao chép và di chuyển các nhà khai thác nhiệm vụ sẽ là public trong bê tông và lớp trừu tượng cho hầu hết các trường hợp.
  • Sao chép và di chuyển các nhà xây dựng sẽ là public trong các lớp bê tông đối với hầu hết các trường hợp.
  • Sao chép và di chuyển các nhà xây dựng sẽ là protected trong lớp trừu tượng đối với hầu hết các trường hợp.
  • Sao chép và di chuyển các nhà xây dựng sẽ là private trong bê tông final các lớp chỉ có thể được tạo bởi friendscho hầu hết các trường hợp.

Trong mọi trường hợp, bạn thông báo cho người dùng thích hợp của một lớp thay vì tất cả người dùng của một lớp.

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