Domanda

Ho più classi che derivano tutte da una classe base, ora alcune classi derivate non verranno compilate a seconda della piattaforma.Ho una classe che mi permette di restituire un oggetto della classe base, tuttavia ora tutti i nomi delle classi derivate sono stati codificati.

Esiste un modo per determinare quali classi sono state compilate, preferibilmente in fase di esecuzione, in modo da poter rimuovere il collegamento e fornire invece librerie caricabili dinamicamente.

È stato utile?

Soluzione

Stai cercando la registrazione della classe runtime C++?ho trovato questo collegamento (backup).

Ciò probabilmente realizzerebbe ciò che desideri, non sono sicuro dei moduli caricati dinamicamente e se puoi registrarli o meno utilizzando lo stesso metodo.

Altri suggerimenti

Non so cosa stai veramente cercando di realizzare, ma potresti inserire un costruttore singleton nel file di implementazione di ciascuna classe derivata che aggiunga il nome a un elenco, insieme a un puntatore a una fabbrica.Quindi l'elenco è sempre aggiornato e può creare tutte le classi compilate.

In genere, fare affidamento sulle informazioni sul tipo di runtime è una cattiva idea in C++.Quello che hai descritto sembra il modello di fabbrica.Potresti prendere in considerazione la creazione di una sottoclasse factory speciale per ciascuna piattaforma, che conoscerebbe solo le classi esistenti su quella piattaforma.

Sembra un posto dove usare il "polimorfismo del tempo di compilazione" o i parametri della policy del modello.

Vedi Modern C++ Design di Andrei Alexandrescu e i suoi Loki implementazione basata sul libro.Vedi anche il Loki pagina su Wikipedia.

Esistono brutti trucchi specifici del compilatore per ottenere informazioni sulla classe in fase di esecuzione.Credimi, non vorrai aprire quel barattolo di vermi.

Mi sembra che l'unico modo serio per farlo sarebbe utilizzare la compilazione condizionale su ciascuna delle classi derivate.All'interno del blocco #ifdef, definisci a nuovo costante che contiene il nome della classe in fase di compilazione.Quindi, i nomi sono ancora codificati, ma tutti in una posizione centrale.

I nomi delle classi derivate devono essere codificati in modo rigido in C++.Non c'è altro modo di usarli.Pertanto, non solo non esiste un modo per rilevare automaticamente quali classi sono state compilate, ma non ci sarebbe modo di utilizzare tali informazioni se esistessero.

Se potessi specificare le classi in fase di esecuzione in base al loro nome, qualcosa del tipo:

std::string foo = "Derivato1";Base * oggetto = nuovo "pippo";// o qualsiasi altra notazione tu voglia, non funziona in C++

quindi sarebbe utile la possibilità di sapere se "Derived1" è stato compilato o meno.Dal momento che devi specificare direttamente la classe, come:

Base * oggetto = nuovo Derived1;// funziona in C++

tutto il controllo viene eseguito in fase di compilazione.

Se ogni classe ha la propria libreria dinamica, controlla semplicemente se la libreria esiste.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top