Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!
Werbeanzeige
Zitat von »"CBenni::O"«
Denn - wie gesagt - kann ich einen void* mit delete löschen, aber der Destruktor von dem Objekt wird nicht ausgelöst.
Zitat von »"drakon"«
Zitat
Denn - wie gesagt - kann ich einen void* mit delete löschen, aber der Destruktor von dem Objekt wird nicht ausgelöst.
static_cast bringt abhilfe, doch dazu muss ich mir merken, welcher Datentyp die Resource ursprünglich hatte.
Hat jemand einen Lösungsvorschlag?
void Zeiger sind C Varianten. Mach einfach eine Basisklasse, von der alle Ressourcen vererbt sind mit einem virtuellen Destruktor. Das ist der Weg, wie man sowas in C++ macht.
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
template<typename T> class Resource { // ... }; std::map<std::string, Resource> MyResources; |
idontknow
unregistriert
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Manager { template <typename T> bool Load<Image>(std::string path); template <typename T> bool Load<Sound>(std::string path); template <typename T> Image* Get<Image>(std::string path); std::map<std::string, void*> m_Resources; } } |
Zitat von »"CBenni::O"«
Ja, aber auch bei vererbung muss man casten, wenn man die Basisklasse als Typ verwendet... Ich haber das ausprobiert; der Destruktor der Basisklasse wurde aufgerufen, der der abgeleiteten Klasse aber nicht!
Zudem geht jede menge Benutzerfreundlichkeit verloren, da man für jeden neuen Resourcentyp eine neue abgeleitete Klasse erstellen muss...
C-/C++-Quelltext |
|
1 2 3 4 |
struct base { virtual ~base () {} }; |
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <iostream> struct base { virtual ~base () { std::cout << "base::~base()\n"; } }; struct a : base { ~a () { std::cout << "a::~a ()"; } }; int main() { a a_; } |
C-/C++-Quelltext |
|
1 2 3 4 |
class foo; foo* bar = new bar; delete bar; delete bar; // Macht doch nichts, oder? |
idontknow
unregistriert
Werbeanzeige