2009-06-12 26 views
11

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?

+2

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ó. –

+0

Tôi tự hỏi nếu nó có thể, làm thế nào bạn mong đợi nó để hành xử? –

+0

Đó 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

Trả lời

31

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) { ... } 
}; 
+0

sẽ không giết RAII? – Qberticus

+0

@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

+2

Um đó là * destructor riêng * ... –

1

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.

0

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ì?

1

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)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 đó.

3

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! ;-)

0

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.)

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