Dal momento che è capito male, devo chiarire. Tutte le seguenti soluzioni non richiedono di ricompilare l'oggetto. Per usare una classe nel tuo codice, se è compilata in un file oggetto, dovresti includere il file di intestazione con la dichiarazione di quella classe.
#include <class.h>
ObjectFoo instance;
E è possibile (ma pericoloso se non si sta attenti) per modificare l'intestazione (a) o copiare l'intestazione in un altro luogo e comprendono che intestazione (b), senza dover ricompilare la classe stessa .
#include <class_fixed.h>
ObjectFoo instance;
Il codice, in cui è incluso il nuovo intestazione sarà solo pensare che all'interno del file oggetto (che non si è ricompilato!) Che troverà attuazione della classe dichiarata come in class_fixed.h
. Mentre persiste la classe dichiarata come in class.h
. Se modifichi gli offset dei membri (aggiungi nuovi membri per esempio) nella nuova intestazione, sei morto e il codice non funzionerà correttamente. Ma cambiare semplicemente l'accesso funziona bene. Il codice compilato non conosce l'accesso, questo è importante solo per la compilazione strana.
Questo non è sempre dannoso. Nella vita di tutti i giorni si verifica un tale cambiamento quando si installa una nuova versione di una libreria nel proprio sistema e non si ricompilano tutti i programmi che dipendono da esso. Ma dovrebbe essere gestito con cura
Ci sono diverse soluzioni.
memcpy()
non lo fanno! Non memcpy poiché la copia di oggetti a volte viene sottoposta a una politica specifica imposta dal progettista della classe. Ad esempio, auto_ptr
s non può essere solo memcopied: se si memcopy il auto_ptr
e quindi viene eseguito il distruttore per entrambi, si tenterà di liberare la stessa memoria due volte e il programma si bloccherà.
Change private:
-public:
nell'intestazione o con macro
Se la licenza lo consente, si può risolvere il problema modificando il file di intestazione che viene fornito con l'implementazione della classe. Indipendentemente dal codice sorgente dell'implementazione (ad es.cpp-file della classe) è sotto il tuo controllo non importa: la modifica privata del pubblico per i membri dei dati (nell'intestazione) è sufficiente e funziona bene anche se ti viene data una libreria solo binaria che contiene la definizione della classe. (Per le funzioni di membro cambiando l'accesso a volte cambia il suo nome interno, ma per MSVS e GCC è ok.)
Aggiunta di una nuova funzione di getter
Mentre cambiare private
-public
è quasi sempre bene (a meno che non si basano su specifiche in fase di compilazione controlla che dovrebbe interrompere la compilazione se la classe ha un determinato membro accessibile), l'aggiunta di una nuova funzione getter dovrebbe essere eseguita con attenzione. La funzione getter deve essere in linea (e quindi definita nel file di intestazione della classe).
reinterpret_cast
Il cast funziona bene se non sei lanciare un puntatore alla classe base dinamica (mezzi dinamici "con funzioni virtuali o basi") la cui istanza effettiva al momento del getto possono essere derivate dalla classe al particolare pezzo di codice.
protected:
E solo nel caso si è dimenticato. Il C++ può dichiarare membri protected:
, cioè accessibile solo alle classi derivate dal dato. Questo potrebbe soddisfare le tue esigenze.
fonte
2009-10-03 08:23:40
Come modificare la fonte? '// private:' funzionerà bene;) – LiraNuna
Penso che voglia tenere gli utenti della sua classe fuori dai guai (quindi i privati) e ha bisogno di implementare qualcosa che non rientri nel design attuale. – jdehaan
Penso che tu non abbia il codice, no? –