title image


Smiley Re: Was ist RUNTIME_CLASS und wofür braucht man das?
Das ist nicht so einfach zu erklären; Man muß schon etwas tiefer in die MFC hineinlangen;



RUNTIME_CLASS ist ein Makro, daß Du benötigst, wenn Du Objekte, sie von CObject abgeleitet sind, dynamisch erzeugen willst. Es ist in etwa so definiert:



#define RUNTIME_CLASS(class_name) (&class_name::class##class_name)



Wenn eines Deiner Objekte z.B. "Foo" heißt, expandiert das Makro:

RUNTIME_CLASS(Foo)

nach

&Foo::classFoo



In der Klasse CObject gibt es eine virtuelle Memberfunktion:



class CObject {

public:

//....

virtual CRuntimeClass* GetRuntimeClass () const;

};



Die Struktur CRuntimeClass enthält u.a. einen Zeiger auf eine Erzeugerfunktion:



struct CRuntimeClass {

//...

CObject* (*mpfn) ();

CObject* create () { return (*mpfn) (); }

};



Wenn z.B. eine Klasse Foo von CObject abgeleitet wird, muß in dieser Klasse ein statisches Objekt der Laufzeitklasse stehen. Außerdem muß die virtuelle Funktion GetRuntimeClass überschrieben werden, und eine statische Erzeugerfunktion deklariert werden:



class Foo : public CObject {

public:

static CRuntimeClass classFoo; // wichtig: der Name muß exakt so lauten !!!



virtual CRuntimeClass* GetRuntimeClass () const {

return &classFoo;

}



// statische Erzeugerfunktion

static CObject* create ();

};



Das statische Laufzeitklassenobjekt muß außerdem noch in einer anderen Übersetzungseinheit definiert werden. Dabei übergibt man dem Laufzeitklassenobjekt einen Zeiger auf die statische Erzeugerfunktion:



CRuntimeClass Foo::classFoo = { .... , Foo::create, ... };



Die Erzeugerfunktion sieht so aus:



CObject* Foo::create () { return new Foo; }





jetzt kannst Du z.B. ein Foo-Objekt dynamisch so erzeugen:



// gib das Laufzeitklassenobjekt der Klasse Foo zurück

CRuntimeClass *prt = RUNTIME_CLASS(Foo);



//rufe Erzeugerfunktion des Laufzeitobjektes auf

CObject *pobj = prt->create ();



Das Ganze ist vorsichtig gesagt, etwas umständlich. Erstens muß die Laufzeitklasse public sein, und zweitens ist es unmöglich, mithilfe dieser Konstruktion Mehrfachvererbung von CObject und anderen Klassen, die von CObject abgeleitet sind, zu implementieren. Man merkt, daß die MFC schon einige Jährchen auf dem Buckel hat.



HTH,

BF



geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: