Làm cách nào để quá tải một trình phá hủy?Làm thế nào để quá tải một destructor?
Trả lời
Bạn không thể. Chỉ có một destructor cho mỗi lớp trong C++.
Những gì bạn có thể làm là tạo một hàm hủy riêng và sau đó có một số phương thức công khai gọi hàm hủy theo các cách mới và thú vị.
class Foo {
~Foo() { ... }
public:
DestroyFoo(int) { ... };
DestroyFoo(std::string) { ... }
};
sẽ không giết RAII? – Qberticus
@Qberticus, có thể theo một số cách. Vẫn không có gì ngăn cản OP tạo ra một lớp bổ sung có RAII đơn giản và phá hủy Foo một cách thú vị.Nếu không có thêm thông tin từ OP tôi không thể nói. Tôi hy vọng OP xem xét điều này và đang xem xét giải pháp của họ. – JaredPar
Um đó là * destructor riêng * ... –
Bạn không thể! Mỗi lớp chỉ có thể có một destructor. Làm thế nào bạn có thể có nhiều hơn một? Trình phá hủy được kích hoạt tự động; không có cách nào ngôn ngữ sẽ biết cái nào để gọi. Tuy nhiên,
Trình phá hủy ảo là một vấn đề khác.
Bạn không. Bạn không thể có 2 destructors trong một lớp.
Bạn đang cố gắng làm gì?
Quá tải có nghĩa là có một số hàm có cùng tên lấy các đối số khác nhau. Giống như swap(int &a, int &b)
và swap(double &a, double &b)
. Một destructor không có đối số. Quá tải nó sẽ không có ý nghĩa.
Nếu bạn cần phải làm những việc khác nhau khi phá hủy một đối tượng tùy thuộc vào hoàn cảnh nhất định, thì bạn chỉ cần các câu lệnh thích hợp nếu có trong destructor của bạn để kiểm tra những trường hợp đó.
Câu hỏi thú vị nhưng lý do duy nhất tại sao bạn muốn quá tải một destructor là vì bạn muốn giải phóng một số tài nguyên trong một destructor và để nó ở phía sau trong một số khác, phải không? Về cơ bản, bạn có thể đạt được hành vi như vậy từ destructor của riêng bạn bằng cách sử dụng một giá trị boolean bổ sung mà sẽ cho bạn biết nếu một tài nguyên cụ thể nên được giải phóng hay không. Boolean này sẽ được thiết lập trong constructor của bạn và/hoặc một trong các phương thức khác của bạn và trong destructor của bạn, bạn kiểm tra nếu nó được thiết lập. Nếu nó không được thiết lập, thì bạn sẽ giải phóng tài nguyên. Nếu không, bạn chỉ cần rời khỏi tài nguyên và có thể một số nhiệm vụ khác sẽ giải phóng nó. (Điều này sẽ có ý nghĩa khi bạn chia sẻ tài nguyên giữa nhiều đối tượng.)
Lý do tại sao bạn không thể quá tải một destructor là vì mã của bạn sẽ không có một đầu mối về destructor cần gọi khi bạn phá hủy một đối tượng . Trừ khi bạn đang gọi destructors xấu nhưng sau đó bạn đang hành xử xấu! ;-)
Bạn không làm quá tải destructor vì bạn không bao giờ gọi nó. Đó là ý chính cơ bản của nó. (Từ những gì chúng tôi đã đi qua trong lớp học.)
- 1. Làm thế nào để cast chức năng miễn phí quá tải để giải quyết xung đột quá tải?
- 2. Làm thế nào để quá tải toán tử của một lớp lồng nhau?
- 3. Làm thế nào để quá tải toán tử ==() cho một con trỏ đến lớp?
- 4. Làm thế nào để quá tải một phương pháp ảo khác với phương pháp phi ảo?
- 5. Làm thế nào để quá tải constructor của một đối tượng trong JS (Javascript)?
- 6. Làm thế nào để ngăn chặn một phương pháp từ quá tải trong Java?
- 7. Khi nào một API bị quá tải?
- 8. Quá tải phương thức. Làm thế nào nó hoạt động?
- 9. như thế nào làm việc Destructor ảo trong C++
- 10. Làm thế nào để giết một quá trình nohup?
- 11. Làm thế nào để giết một quá trình C#?
- 12. Làm thế nào để giết một quá trình trong Cygwin?
- 13. Làm thế nào để giết một quá trình từ WiX
- 14. Python: Làm thế nào để tải về một file zip
- 15. Làm thế nào tôi có thể gọi một destructor tư nhân từ một shared_ptr?
- 16. Làm thế nào để xóa một đối tượng của một loại hình đa hình mà không có destructor ảo
- 17. Làm rõ quá tải
- 18. C# - Làm thế nào tôi có thể "quá tải" một đại biểu?
- 19. Làm cách nào để quá tải một toán tử cho một liệt kê trong C#?
- 20. Làm thế nào để xác minh xem một loại quá tải/hỗ trợ một nhà điều hành nhất định?
- 21. Windbg: Làm thế nào để thiết lập điểm ngắt trên một trong những quá tải của một hàm C++?
- 22. Làm thế nào để quá tải một số chuyển đổi Groovy Type để tránh try/catch của NumberFormatException?
- 23. Làm thế nào để phát hiện quá tải phương thức trong các lớp con trong python?
- 24. Làm thế nào để quá tải các hàm do người dùng định nghĩa trong Matlab?
- 25. làm thế nào để quá tải postfix và điều hành tiền tố trong C#
- 26. Làm thế nào để liên kết/nhóm quá tải trong C# XML ý kiến?
- 27. phương pháp Làm thế nào để gọi quá tải Java trong Clojure
- 28. Làm thế nào để ép buộc quá tải hàm mẫu cho tăng :: liên kết?
- 29. Làm thế nào để quá tải phương pháp __bool__ của Python?
- 30. quá tải của Math.sqrt: phương pháp quá tải dường như để che giấu bản gốc một
Vì bạn không thể, bạn có một số ý tưởng làm thế nào để sử dụng một destructor quá tải, hoặc là bạn chỉ tò mò? Nếu bạn muốn làm điều gì khác hơn là chỉ cần tạo hai destructors cho một lớp, hãy mang nó lên và chúng ta có thể thảo luận làm thế nào để hoàn thành nó. –
Tôi tự hỏi nếu nó có thể, làm thế nào bạn mong đợi nó để hành xử? –
Đó là một câu hỏi được đưa ra bởi người khác. Họ muốn xem SO sẽ phản ứng nhanh như thế nào. – Joshua