Normalmente, se si conoscono tutti i tipi che si intende creare prima della mano, si può semplicemente fare qualcosa di simile:Come si può progettare una classe base, quindi conosce tutte le classi "derivate" in fase di esecuzione?
typedef enum{
BASE_CREATURE_TYPE = 0,
ANIMAL_CREATURE_TYPE,
...
}CREATURE_TYPES
Ma questo diventa noioso, perché ogni volta che si crea una nuova classe, è necessario aggiornare l'enum. Inoltre, CREATURE_TYPES è ancora solo elementi in un enum - come legare a una classe reale?
Mi chiedevo se ci fosse un modo, potevo semplicemente scrivere le classi, e in fase di esecuzione, senza istanziare realmente un oggetto, creare un set contenente tutti i tipi.
E 'possibile in C++? In Java c'è qualcosa chiamato "blocchi statici", che vengono eseguiti quando la classe viene caricata dalla JVM.
EDIT: Questa domanda non riguarda blocchi statici - È solo un esempio - Mi chiedo se c'è un modo, che posso eseguire un metodo o un blocco di codice in modo da sapere quali classi esistono in fase di esecuzione, senza effettivamente creazione di un oggetto
MODIFICA: Intendevo set di tutti i tipi, non "mappe", quindi posso creare un oggetto di ogni tipo, senza dover mantenere un elenco.
MODIFICA: Il motivo per cui lo voglio, è perché sto cercando di creare una funzione che possa chiamare metodi su tutte le classi derivate che fanno parte dell'applicazione. Ad esempio, dire che ho diverse classi che derivano tutte dalla classe Foo, e hanno uno sfere():
Foo{
balls();
}
Boo : public Foo{
balls();
}
Coo: public Foo{
balls():
}
In fase di esecuzione, mi piacerebbe sapere su tutte le classi derivate in modo da poter chiamare:
EDIT: Nota che non è necessario conoscere tutti i membri di ogni classe derivata, voglio solo sapere quali sono tutte le classi derivate, quindi posso chiamare balls(), su ognuna di esse.
EDIT: Questa domanda è simile: How to automatically register a class on creation
Ma, purtroppo, si sta memorizzando uno std :: string(). Come si fa riferimento alla classe attuale?
MODIFICA: Nella risposta di Smeehey di seguito, nel metodo principale, come creerei effettivamente un'istanza di ogni classe e chiamerei metodi sia statici che non statici?
"Crea una mappa"? Che tipo di mappa? La mappa di Luke Skywalker? –
Puoi spiegare perché lo vuoi? Probabilmente sarà più facile rispondere in questo modo. –
@ShayNehmad Lo voglio in modo che possa popolare dinamicamente un menu, che è usato per creare i vari tipi derivati. Ma sarebbe molto noioso legare un pulsante a ogni tipo derivato, quindi stavo cercando di determinare se c'è un modo per "riflettere" tutte le classi derivate che fanno parte dell'applicazione così posso richiamare dinamicamente tutti i metodi, senza conoscendo ognuno dei tipi. –