Tại sao mọi người lại tuyên bố một nhà xây dựng được bảo vệ? Tôi biết rằng các nhà xây dựng được khai báo riêng cho mục đích không cho phép tạo ra chúng trên stack.Cách sử dụng thực tế của một nhà xây dựng được bảo vệ là gì?
Trả lời
Khi một lớp (được dự định là) một lớp trừu tượng, một hàm tạo được bảo vệ là chính xác. Trong tình huống đó, bạn không muốn các đối tượng được khởi tạo từ lớp nhưng chỉ sử dụng nó để kế thừa từ đó.
Có các trường hợp sử dụng khác, như khi một tập hợp các thông số xây dựng nhất định nên được giới hạn trong các lớp dẫn xuất.
một sử dụng có thể là mô hình nhà máy
Một constructor bảo vệ có nghĩa là thành viên duy nhất có nguồn gốc có thể xây dựng các thể hiện của lớp (và các trường hợp có nguồn gốc) sử dụng constructor đó. Điều này nghe có vẻ hơi gà và trứng, nhưng đôi khi hữu ích khi thực hiện các nhà máy lớp học.
Về mặt kỹ thuật, điều này chỉ áp dụng nếu TẤT CẢ các ctors được bảo vệ. – MSalters
lớp bạn bè cũng có thể gọi hàm tạo được bảo vệ (không chỉ các lớp dẫn xuất). –
...và việc sử dụng một lớp người bạn gọi là constructor được bảo vệ sẽ là trường hợp đối tượng có các thành viên không đổi (được thiết lập bởi hàm tạo) nhưng cần phải được công khai, nhưng không bao giờ được đặt bởi bất kỳ truy cập công cộng nào khác, đảm bảo rằng đối tượng sẽ không được tạo ở đâu đó và dữ liệu do đó sẽ không bị sửa đổi ở bất kỳ nơi nào khác. – osirisgothra
Để cho một lớp con sử dụng một hàm tạo nên không thể truy cập trực tiếp vào trình tạo nhanh.
Bạn có thể sử dụng nó để hạn chế các lớp học mà có thể tạo ra nó, ví dụ:
class Level
{
private:
Level();
¨Level();
friend class LevelManager;
};
Lớp duy nhất có thể tạo ra một thể hiện của nó là lớp LevelManager, vì vậy bạn sẽ luôn luôn biết rằng Cấp instance được tạo trong LevelManager.
Trong khi đúng, đó là một hàm tạo riêng, không được bảo vệ. – David
ahaha xin lỗi, tôi đã đọc sai. Tôi có nên xóa bài viết của mình không? –
Nhà thầu ngoài công lập rất hữu ích khi có các yêu cầu xây dựng không thể được đảm bảo duy nhất bởi nhà xây dựng. Ví dụ, nếu một phương thức khởi tạo cần phải được gọi ngay sau hàm tạo, hoặc nếu đối tượng cần đăng ký chính nó với một đối tượng container/manager nào đó, thì điều này phải được thực hiện bên ngoài hàm tạo. Bằng cách hạn chế quyền truy cập vào hàm tạo và chỉ cung cấp một phương thức factory, bạn có thể đảm bảo rằng bất kỳ cá thể nào mà người dùng nhận sẽ thực hiện tất cả các bảo đảm của nó. Điều này cũng thường được sử dụng để thực hiện một Singleton, mà thực sự chỉ là một đảm bảo lớp làm cho (rằng sẽ chỉ có một trường hợp duy nhất).
Lý do làm cho hàm tạo được bảo vệ, chứ không phải là riêng tư, cũng giống như để thực hiện bất kỳ phương thức hoặc trường nào khác được bảo vệ thay vì riêng tư: để có thể được thừa hưởng bởi trẻ em. Có lẽ bạn muốn có một phương thức công cộng, không ảo trong lớp cơ sở, nó trả về các tham chiếu đến các cá thể của các lớp dẫn xuất; các lớp dẫn xuất rõ ràng muốn truy cập vào các hàm tạo cha mẹ, nhưng bạn vẫn không muốn tạo chúng bên ngoài nhà máy của bạn.
Đối với phương pháp nhà máy có tác dụng phụ.
class mine {
private:
mine() {};
protected:
mine(int id) : m_id(id) {};
int m_id;
static int m_count;
public:
static mine* CreateOneOfMe() {
return mine(m_count++);
}
int GetId() { return m_id; }
};
Điều này tạo ra trường hợp của lớp và đảm bảo rằng mỗi lớp có một số nguyên tăng dần duy nhất. Lưu ý rằng nếu hàm tạo bạn muốn sử dụng không phải là mặc định, bạn cũng phải ẩn mặc định.
Một hàm tạo được bảo vệ có thể được sử dụng để tạo lớp trừu tượng một cách hiệu quả khi không có phương thức nào là thuần ảo.
Nó không hoàn toàn trừu tượng theo nghĩa C++ vì lớp bạn bè vẫn có thể sử dụng nó mà không ghi đè, nhưng sau đó bạn sẽ phải khai báo chúng.
- 1. Bảo vệ CSRF thực sự là gì?
- 2. Xây dựng được bảo vệ bằng mật khẩu cho TFS2010
- 3. Trường hợp sử dụng cho một nhà xây dựng chung là gì?
- 4. Một số câu hỏi về lớp trừu tượng với các nhà xây dựng riêng, công cộng và được bảo vệ
- 5. Sử dụng nhiều chuỗi nhà xây dựng cho một chuỗi
- 6. Sử dụng bộ nhớ của nhà xây dựng trong Haskell
- 7. Là một nhà xây dựng công cộng trong một lớp trừu tượng một mã số?
- 8. ID Android được bảo vệ trong R.java
- 9. Nhà xây dựng ngầm là gì trên Java
- 10. Điều gì là sự tinh tế của, nhà điều hành?
- 11. tại sao danh sách các nhà xây dựng thực tế của một lớp trong javascript quan trọng
- 12. "Đối tượng được xây dựng không hoàn toàn" là gì?
- 13. Sử dụng make_shared với một constructor được bảo vệ + giao diện trừu tượng
- 14. Làm thế nào để xây dựng một ví dụ bảo vệ rất cơ bản?
- 15. Nội dung được bảo vệ có nghĩa là gì .Net
- 16. Việc sử dụng biến số thực tế là gì?
- 17. Cách sử dụng của C++ xây dựng "vị trí mới" là gì?
- 18. Việc sử dụng thực tế cho sự lười biếng như một tính năng ngôn ngữ được tích hợp là gì?
- 19. gì được bảo vệ ảo mới
- 20. Cách tốt nhất để trả lại IDisposables được xây dựng một cách an toàn là gì?
- 21. Làm gián điệp một nhà xây dựng bằng cách sử dụng Jasmine
- 22. Lý do của việc sử dụng các hội tụ ngầm/rõ ràng thay vì các nhà xây dựng là gì?
- 23. Được coi là thiết kế xấu để thực hiện các hoạt động lâu dài trong một nhà xây dựng?
- 24. Tại sao lại sử dụng các tác dụng phụ xấu trong các nhà xây dựng JavaScript?
- 25. Hệ thống xây dựng thực tế cho D
- 26. Sử dụng thực tế của System.WeakReference
- 27. shell được xây dựng trong lệnh trong linux là gì?
- 28. Lợi ích của các nhà xây dựng chung
- 29. Cách phát hiện Chế độ Bảo vệ của IE bằng cách sử dụng C#
- 30. Sử dụng bảo vệ-minitest trên một tệp Ruby
+1 Nhưng không nhất thiết phải là một lớp trừu tượng. Nó thường là trường hợp mặc dù. – ralphtheninja
Không đủ để khai báo một hàm thuần ảo để xác định một lớp cơ sở? Hoặc ở trên là không có chức năng ảo thuần túy. Sự kiện sáng tạo cho lớp Bắt nguồn của lớp Tóm tắt như vậy là gì? –
@Henk Holterman Chắc chắn không - xem Phần 10.4 của Tiêu chuẩn C++, có tên là "Lớp trừu tượng" –