2
我管理的析構函數是私有的類,因爲必須將對象分配到堆中。當析構函數是私有的時,我應該如何在C++ 11中使用唯一指針?
讓我們假設這個類作爲A.
std::unique_ptr<A> a(new A());
當這一個超出範圍,析構函數被調用。
但是,unique_ptr的默認行爲是調用「public destructor」。
在這種情況下,我應該怎麼做而不公開析構函數?
我管理的析構函數是私有的類,因爲必須將對象分配到堆中。當析構函數是私有的時,我應該如何在C++ 11中使用唯一指針?
讓我們假設這個類作爲A.
std::unique_ptr<A> a(new A());
當這一個超出範圍,析構函數被調用。
但是,unique_ptr的默認行爲是調用「public destructor」。
在這種情況下,我應該怎麼做而不公開析構函數?
您可以定義一個deleter
函數,並將其與您的類一起使用friend
。
#include <memory>
class A{
friend struct D;
private:
~A() {}
};
struct D {
void operator()(A* a) const {
delete a;
}
};
int main(){
std::unique_ptr<A, D> a(new A());
return 0;
}
嘗試把'朋友的std ::的unique_ptr :: deleter_type;''裏面A' –
「必須被分配到堆」 - 如果你的意思是,必須在堆上分配,使得私有析構並不是最好的方法。使所有構造函數都是私有的,只允許通過已經返回'unique_ptr'的工廠函數創建對象。否則,客戶必須在每次使用時處理奇怪的語法。 –
@PiotrSkotnicki不幸的是,這不是便攜式。刪除者可以使用不屬於其類的一部分的幫助函數來進行實際刪除,然後再次失敗。 –