我的gui應用程序支持多態時間事件,這意味着用戶調用new,並且gui調用delete。如果運行時間不兼容,這可能會造成問題。這會導致與DLL不同運行時的問題嗎?
所以有人告訴我提議的解決方案將是這樣:
class base;
class Deallocator {
void operator()(base* ptr)
{
delete ptr;
}
}
class base {
public:
base(Deallocator dealloc)
{
m_deleteFunc = dealloc;
}
~base()
{
m_deleteFunc(this);
}
private:
Deallocator m_deleteFunc;
}
int main
{
Deallocator deletefunc;
base baseObj(deletefunc);
}
雖然這是一個很好的解決方案,它要求用戶創建,我不希望有一個釋放器對象。然而我想知道是否我爲每個派生類提供了釋放器:例如
class derived : public base
{
Deallocator dealloc;
public:
Derived() : base(dealloc);
{
}
};
我認爲這仍然不起作用。約束是: addTimedEvent()函數是Widget類的一部分,該類也在dll中,但它由用戶實例化。另一個約束是一些派生自Widget的類使用它們自己的定時事件類來調用這個函數。
鑑於「誰叫新必須調用刪除」什麼可以工作給這些限制?
感謝
您必須使基類析構函數爲虛擬。 – 2011-01-10 16:09:23
@Hans:對於問題中的提議(斷開)機制,是的,析構函數應該是虛擬的。但許多處理問題的衆所周知的方法並不需要虛擬銷燬。 – 2011-01-10 16:14:33