Ich moechte klassen in c++ auf diese weise erzeugen
Das* das = createClass("Das");
Ein user einer lib, die ich schreibe, soll sich selbst klassen bauen, welche ich dann mit meiner lib instanziiere, der string "Das" kommt aus einem xml-config-file.
Ich bin auf folgenden code gestossen der das tun soll.
Code: Alles auswählen
/**
* Register class. This defines a factory object which makes it possible
* to create an object by the passing class name to the createOne() function.
* The class must be a subclass of cPolymorphic, otherwise a compile-time error
* will occur: <i>"cannot convert..."</i>
*
* @hideinitializer
*/
#define Register_Class(CLASSNAME) \
cPolymorphic *CLASSNAME##__create() {return new CLASSNAME;} \
EXECUTE_ON_STARTUP(CLASSNAME##__class, classes.instance()->add(new cClassRegister(#CLASSNAME,CLASSNAME##__create));)
/**
* Allows code fragments to be collected in global scope which will
* then be executed from main() right after program startup. This is
* used by in OMNeT++ for building global registration lists of
* module types, network types, etc. Registration lists in fact
* are a simple substitute for Java's Class.forName() method...
*
* @hideinitializer
*/
#define EXECUTE_ON_STARTUP(NAME, CODE) \
static void __##NAME##_code() {CODE;} \
static ExecuteOnStartup __##NAME##_reg(__##NAME##_code);
cPolymorphic *createOne(const char *classname)
{
cClassRegister *p = (cClassRegister *)classes.instance()->get(classname);
if (!p)
throw new cException("Class \"%s\" not found -- perhaps its code was not linked in, or the class wasn't registered via Register_Class()", classname);
return p->createOne();
}
class SIM_API cClassRegister : public cObject
{
...
/**
* Creates an instance of a particular class by calling the creator
* function. The result has to be cast to the appropriate type
* (preferably by dynamic_cast or check_and_cast).
*/
cPolymorphic *createOne() const {return creatorfunc();}
//@}
};
Was ich nun nicht verstehe:
1. wozu wird immer wenn ich das program starte erstmal zu jeder klasse eine instanz erzeugt ?
Das macht das macro Register_Class().
Ich vermute, weil er so merkt, ob die Klasse existiert oder nicht, also ob eine instance von der Klasse "Das" vorliegt.
2. das macro EXECUTE_ON_STARTUP schafft es dass code direkt nach main ausgefuehrt wird, was ist das denn verruecktes ?
3. Was bedeuten die hashes in den macros # und ##.
Gruss,
Lisan.
p.s. ich hoffe die frage ist nicht ganz so off topic.