Lade...
 

Generic function New

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 aus

static 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.