Newsgroup: it.comp.lang.c++
Titolo: Salvare un oggetto su file

Salve,
qualcuno sa dirmi come si può salvare un oggetto di una classe su file
passando il puntatore all'oggetto stesso?? Magari con un SaveToFile
del MemoryStream (uso il bcb)??
Cioè l'idea sarebbe di "copiare" la memoria riservata all'oggetto su
un file in modo da poi rileggerlo, rimetterlo in memoria e, avendo un
puntatore all'inizio dell'area riservata, accedere a tutto l'oggetto
della classe.
Grazie,
Mic


potresti creare una classe base Object con il metodo SaveToFile (virtuale) che
salva su file l'area di memoria dal puntatore dell'oggetto (this) a (this +
sizeof(Object)).
derivi tutte le classi che devono avere questa funzionalità da Object, e nel
caso di classi con puntatori, fai l'override di SaveToFile per fare in modo
che venga salvato tutto il necessario.
ciao :: xaero

 della classe.
Gli *unici* tipi di oggetti che possono essere salvati e ricostruiti
copiando l'area di memoria corrispondente sono gli oggetti di tipo POD
(Plain Old Data).
Un tipo č POD se č un tipo built-in oppure se č una struct priva di
costrutturi non banali contenente esclusivamente membri di tipi POD.
Max



E come fai se l'istanza della classe ha dei puntatori? E se puntano a
classi non tue che non sai come sono implementate? E se hai qualche
valore che memorizza un valore di sistema (ad es. HFONT di win)?
Penso ti convenga scriverti da te la funzione e al massimo memorizzare
dei dati per ricreare quello che non puoi salvare, ad esempio per un
font puoi memorizzare il carattere, le dimensioni...
--
Marco Barisione (ICQ 84277092)

font puoi memorizzare il carattere, le dimensioni...
Cercavo una via più comoda...;-)
La classe contiene due stringhe ed una matrice (array a due
dim)........
Mic

Ciao,
Questo newsgroup si occupa del linguaggio C++ in quanto tale, e non di
aspetti specifici di particolari implementazioni. Per questo non e' il
posto piu' adatto per porre domande specifiche come la tua.
Potresti avere piu' fortuna su uno dei gruppi della gerarchia
borland.public.cppbuilder.*, disponibili sul server
newsgroups.borland.com
 (prevalentemente in inglese, ma si puo' postare
anche in italiano).
Li' ti potranno spiegare quali meccanismi specifici mette a disposizione
BCB.
Grazie,
Nicola Musatti

Grazie per la segnalazione e scusatemi per l'OT non voluto.
Mic


 Questo newsgroup si occupa del linguaggio C++ in quanto tale, e non di
Andrebbe sottolineato che l'OT segnalato da Nicola vale solo se la tua domanda
riguarda specificatamente l'uso delle API di borland che hai citato. Il problema
generale della persistenza resta IT.
Pero' come già ti e' stato detto ... non e' risolvibile nella maniera semplice
da te sperata.
Due ulteriori note:
la risposta data da xaero evidentemente non funziona perche' la sizeof della
classe base e' fissa e non cambia a seconda dell'istanza, se poi la funzione e'
virtuale ... allora la classe non e' per definizione un POD e non puoi salvarla
"a blocco".
Chi ti ha risposto che solo le classi POD possono essere salvate e ripristinate
come da te richiesto ha dimenticato di dirti che la cosa funziona solo se:
1) la classe e' pod
2) save e restore sono fatte da programmi che sono:
2a) compilati con lo stesso compilatore (stessa versione) E
2b) compilati con gli stessi switch
3) salvati e ripristinati sullo stesso sistema
Se una qualunque di queste cose cambia, non hai la certezza che la cosa
funzioni.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

 "a blocco".
me ne ero accorto. mi sono dimenticato di precisare che:
con il mio metodo bisogna reimplementare ::SaveToFile ogni volta che si deriva
una classe, anche se la derivata resta un POD.
veramente avevo in mente di mettere sizeof(*this), ma purtroppo ho constatato
che non cambia niente. devo riscrivere sizeof(*this) nella classe derivata per
ottenerne la dimensione; usando il metodo della classe base ottengo la
dimensione della classe base (ma perchč?).
ciao :: xaero

 dimensione della classe base (ma perchč?).
Mi sembra evidente. Se il metodo e' un metodo della classe base ... this e' un
puntatore alla classe base. Quindi e' ovvio che sizeof(*this) ti restituisca la
dimensione della classe base.
