Meine GUI-Anwendung unterstützt polymorphe zeitgesteuerte Ereignisse, so dass der Benutzer neue und die GUI-Aufrufe löscht. Dies kann zu einem Problem führen, wenn die Laufzeiten nicht kompatibel sind.Wird dies ein Problem mit verschiedenen Laufzeiten mit DLL verursachen?
So wurde mir gesagt, eine vorgeschlagene Lösung sein würde:
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);
}
Während dies eine gute Lösung ist, tut es verlangen, dass der Benutzer ein Deallocator-Objekt erstellen, das will ich nicht. Ich frage mich aber, ob ich eine Deallocator zu jeder abgeleiteten Klasse bereitgestellt: zB
class derived : public base
{
Deallocator dealloc;
public:
Derived() : base(dealloc);
{
}
};
Ich denke, das immer noch nicht, obwohl nicht funktioniert. Die Einschränkung ist: Die Funktion addTimedEvent() ist Teil der Widget-Klasse, die ebenfalls in der DLL enthalten ist, aber vom Benutzer instanziiert wird. Die andere Einschränkung besteht darin, dass einige Klassen, die von Widget abgeleitet sind, diese Funktion mit ihren eigenen zeitgesteuerten Ereignisklassen aufrufen.
Vorausgesetzt, dass "er, der neu angerufen hat, löschen muss" was könnte angesichts dieser Einschränkungen funktionieren?
Dank
Sie müssen die Basisklasse destructor virtuell machen. –
@Hans: Für den vorgeschlagenen (gebrochenen) Mechanismus in der Frage, ja sollte der Destruktor virtuell sein. Aber viele der bekannten Wege, das Problem zu lösen, erfordern keine virtuelle Zerstörung. –
Dieser [Blogpost] (http://blogs.msdn.com/b/oldnewthing/archive/2006/09/15/755966.aspx) bietet einige Lösungen für dieses Problem. – Naveen