Ich habe ein Projekt mit einer großen Codebasis (> 200.000 Zeilen Code) ich pflegen ("The Core").Überschreiben/Ändern von C++ - Klassen mit DLLs
Derzeit verfügt dieser Kern über eine Skript-Engine, die aus Hooks und einer Skript-Manager-Klasse besteht, die alle süchtig Funktionen (die per DLL registriert) aufruft, wenn sie auftreten. Um ganz ehrlich zu sein, ich weiß nicht, wie genau das funktioniert, da der Kern meistens undokumentiert ist und mehrere Jahre und eine Größenordnung von Entwicklern (die natürlich abwesend sind) überspannt. Ein Beispiel für die aktuelle Scripting-Engine ist:
void OnMapLoad(uint32 MapID)
{
if (MapID == 1234)
{
printf("Map 1234 has been loaded");
}
}
void SetupOnMapLoad(ScriptMgr *mgr)
{
mgr->register_hook(HOOK_ON_MAP_LOAD, (void*)&OnMapLoad);
}
Eine zusätzliche Datei setup.cpp
ruft SetupOnMapLoad
mit dem Kern des genannten ScriptMgr
.
Diese Methode ist nicht was ich suche. Für mich ist die perfekte Skript-Engine eine, mit der ich die Hauptklassenmethoden überschreiben kann. Ich möchte in die Lage, Klassen zu erstellen, die von Core-Klassen erben und erweitert auf sich, wie so:
// In the core:
class Map
{
uint32 m_mapid;
void Load();
//...
}
// In the script:
class ExtendedMap : Map
{
void Load()
{
if (m_mapid == 1234)
printf("Map 1234 has been loaded");
Map::Load();
}
}
Und dann will ich jede Instanz Map
sowohl im Kern und Skripte, um tatsächlich eine Instanz von ExtendedMap
sein.
Ist das möglich? Wie?
Ich möchte nicht, dass die Quelle "ExtendedMap" hat, wenn die Skripte keine solche Klasse bereitstellen. Die Idee ist, bestimmte (oder alle) Klassen neu zu registrieren, nachdem ich sie erweitert habe, in der DLL selbst. – MoshiBin