2017-06-09 1 views
0

ProblemRatsuchenden auf C++ Design

den Destruktor von einem Zeiger auf eine Basisklasse aufrufen ruft nicht die Klasse destructor abgeleitet. Mein Ziel war es, eine Manager-Klasse zu haben, die den Speicher verarbeitet, aber es scheint nicht funktional zu funktionieren, was mich zwingt, explizit delete für die Variable einer Klasse mit Kenntnis der abgeleiteten Klasse aufzurufen. Dies ist machbar, es nur irgendwie hässlich aussieht, zum Beispiel:

// MainMenu.cpp 
void MainMenu::pressedEditor(void* data) 
{ 
    MainMenu* menu = (MainMenu*)data; 
    menu->swapListener(new EditorMenu()); 
    delete menu; // I want `swapListener` to be able to do this. 
} 

// EventListener.cpp 
void EventListener::swapListener(EventListener* module) 
{ 
    dispatcher->remove(this); 
    dispatcher->add(module); 
} 

Eine Lösung hierfür wäre, den Prä-Prozessor verwenden, jedoch habe ich das Gefühl, als ob der Code besser grundsätzlich geschrieben werden kann.

Hintergrund

Ein Dispatcher-Klasse ist verantwortlich für die Ereignisse (Eingang, Updates, etc.) für alle Kinder Zuhörer senden.

Wenn ein Kind-Listener vom Dispatcher aufgerufen wird, kann er sich für einen Listener eines anderen abgeleiteten Typs auslagern. In diesem Szenario verhält sich der Dispatcher ähnlich wie eine Szene oder ein Statusmanager, indem eine Klasse hinzugefügt wird, aber eine Klasse sich für eine andere Klasse (Szene oder Zustand) vertauschen kann.

+4

Ihr Destruktor der Basisklasse muss virtuell sein. –

+3

Sie müssen Ihre Basisklasse destructor 'virtual' machen. – NathanOliver

+0

Oh ja, vergaß das. Vielen Dank – user2940623

Antwort

0

Der Aufruf des Destruktors von einem Zeiger auf eine Basisklasse ruft den abgeleiteten Klassendestruktor nicht auf.

Fast sicher ist Ihr Basisklasse-Destruktor nicht korrekt als virtuell markiert, wenn dies geschieht.