Generic function New
Mit dem Macro
#define GENERIC \ static CX_CLASS *New(os_segment *, os_typespec *);
wird einer Klasse die Deklaration einer Funktion 'New' hinzugefügt. CXDGEN erzeugt den Funktionskörper, wenn die Anweisung:
GENERIC(className)
angegeben wurde. Ein Blick auf den (für eine hypothetische Klasse A) generierten Code
// generic function CX_CLASS *A::New(os_segment *_seg, os_typespec *_tspec) { CX_CLASS *object; #ifdef _OBJECTSTORE_H_ object = new(_seg, _tspec) A; #else object = new A #endif return object; }
zeigt, dass der Default-Konstruktor der Klasse aufgerufen wird, der wie folgt aussehen sollte:
const IDX_A = 20001; A::A(void) : CX_CLASS(IDX_A) { // eigene Initialisierungen }
Die ClassiX®-Architektur verlangt,
dass für jede Klasse ein ganzzahliger (und eindeutiger) Identifikator festgelegt wird. Dieser Wert muss beim Aufruf des Konstruktors der Klasse CX_CLASS übergeben werden.
Hinweis: Für Erweiterungen ist der Zahlenbereich 20000 < id < 30000 reserviert!
Der Objektmanager ruft New() auf, um ein transientes oder persistentes Objekt zu erzeugen.
Die New()-Funktionen aller neu einzuführenden Klassen müssen deshalb in einer Tabelle zusammengefasst und beim Objektmanager angemeldet werden (Funktion RegisterClasses).
Diese Code-Sequenz sieht (für Klassen A, B, ...) wie folgt ausstatic CXS_FACTORY_ENTRY factoryTable[] = { { IDX_A, A::New }, { IDX_B, B::New }, . . . { IDX_NOTHING, } }; void EXPORT_ RegisterClasses(void) { CX_CLASS::objectManager->RegisterClasses(factoryTable); }
und muss mit der Hand geschrieben werden. Der Kreis schließt sich, wenn ClassiX® die
DLL kennt, die obengenannte Funktion enthält. Diese Angabe steht im href="de_techdocu_specific_mpg_mpg04909">Initialisierungs-File CLASSIX.INI.