Newsgroup: it.comp.lang.c++
Titolo: This

salve sto utilizzando un ofstream  ed in particoale il metodo write che  ha
la seguente sintassi(credo)
     write(const char *, unsigned int)
ora ho visto che si può usare anche con gli  oggetti, testato e funziona.
Il mio problema consiste nel fatto che richiamo tale metodo  in uno della
classe che voglio memorizzare, ad esempio
class pippo{
void pluto(string nomefile);
......
......
};
pippo::pluto(string nomefile)
{ofstream out(nomefile.begin()) ;
 out.write((char*) this, sizeof(this));   //pippo
out.close();
}
Questo non funziona, o melgio mi crea il file ma non  ci scrive niente.
Se invece da codice faccio:
pippo p;
ofstream out(nomefile.begin()) ;
out.write((char*)  &p, sizeof(p));   //pippo
out.close();
scrive qualcosa sul file. ora ho pensato che il problema è il puntatore
this, ma dove è il mio errore?
grazie.
N.B. Tommy al posto di pippo leggici partita, il programma è sempre lo
stesso!
.

 this, ma dove è il mio errore?
Non ne sono certo ma penso proprio che il problema sia appunto il this...
Al massimo sarebbe opportuno sizeof(pippo).
Comunque sta attento perché per salvare una classe non si usa quel metodo!
Quel metodo va bene per salvare un buffer di dati, che può essere anche una
struttura o una classe ma non in generale.
Ad esempio puoi salvare con successo (*) una struttura del tipo
struct ciao {
    char nome[20];
    int anni;
};
perché viene allocata in memoria ciao* p un segmento di sizeof(ciao) bytes e
allora li salvi e quindi poi quando li recuperi te li ritrovi.
E' un pò lo stesso problema della copia tra istanze di una classe.
se p e q sono due puntatori alla struttura ciao, per copiare p in q puoi
copiare i suoi byte da p a q.
Se però anziché char nome[20] tu avessi char* nome; allora le cose si
complicano.
Il sistema descritto prima sembra funzionare ma in realtà q->nome
s'identifica con p->nome, sono la stessa cosa perché puntano allo stesso
indirizzo di memoria.
Se addirittura, questa volta, salvi la nuova struttura toppi mostruosamente
perché salvi un puntatore che poi quando lo ripeschi punta a "spazzatura" e
quasi sicuramente ottieni un crash.
(*) Poi c'è anche il problema che se cambi compilatore e ricompili il
programma con la prima struttura ciao d'esempio potresti perdere la
compatibilità con il tuo file perché magari usa interi a 128 bit!! Ci sono
dei compilatori C che usano interi a 16 bit...
In generale quando si replica una classe o una struttura (in memoria
centrale o di massa) bisogna preoccuparsi di eventuali tipi creati in modo
dinamico o istanze statiche che però hanno al loro interno elementi dinamici
(spesso non sappiamo cosa c'è dentro, quello che sappiamo è però la sua
interfaccia), come puntatori o certe classi (string, vector, liste, e tutti
i contenitori).
Bisogna fare in modo che la copia sia in grado di ricreare le medesime
strutture (in senso letterale), cioè se ho anziché char nome[20] ho string
nome, non devo cercare di salvare il buffer di memoria che contiene nome, ma
quando invece copio la struttura devo creare al volo la classe string nome
con il costruttore opportuno.
Non a caso si vede spesso nelle classi costruttori copia e overload
dell'operatore d'assegnamento =, proprio per ricreare correttamente i dati
nella classe replica.
Quindi in linea generale (a meno che non sei nel caso elementare che citavo
prima e accetti la limitazione della nota *) quello che devi fare, se hai
dei valori che t'interessano all'interno della tua classe e la vuoi rendere,
come si dice, persistente, è salvare quei valori in un file (usando un
ofstream), poi quando vuoi leggere la classe ti fai un metodo che legge da
un ifstream i valori che poi usi per costruire o riassegnare le istanze
all'interno della tua classe.

 ha scritto nel messaggio
news:avnjo8$p5m$1...@lacerta.tiscalinet.it...


 ha scritto nel messaggio
news:ZJIT9.13081$0v.3...@news1.tin.it...


 ha scritto nel messaggio
news:avp3vh$70t$1...@lacerta.tiscalinet.it...



Come è stato detto circa mille volte in questo NG, la tecnica che usi per
memorizzare un oggetto ha senso *soltanto* se la classe
  1. è di un tipo POD
  2. non contiene puntatori
Per la definizione di POD e altri risvolti della questione:
 
http://groups.google.com/groups?as_q=pod&as_ugroup=it.comp.lang.c%2b%2b
 
(Nota, in particolare, il thread con subject: "Salvare un oggetto su
file".)
Max
 

 ha scritto nel messaggio
news:V1FT9.16290$AA2.7...@news2.tin.it...


 ha scritto nel messaggio
news:Pine.LNX.4.21.0301111102170.11691-100000@blomma...



Forse non ti e' chiara la soluzione che ti ha dato Max.
Il problema e' chiaro.
Quello che fai, ti puo' funzionare per certi oggetti ma non per altri, non
e' una soluzione che funziona sempre.
Rileggi bene i suggerimenti che ti sono stati dati e vai a guardare nei
links suggeriti.
Inoltre quando rispondi quota per bene ovvero metti la parte del messaggio
vecchio a cui rispondi in alto (non e' detto che tu debba metterlo tutto,
specie se lungo) e poi sotto scrivi la tua replica.
Maurus

Tutto risolto mi ero semplicemente dimenticato un'asterisco.
facevo
ofstream out("pippo");
out.write((char *) this, sizeof(this));
anzichč
out.write((char *) this, sizeof(*this));
grazie

 wrote in message
news:paaU9.24064$AA2.1...@news2.tin.it...

Il metodo che usi oggi per risolvere questa necessita' potrebbe non esserve
valido domani per un altro tipo di classe/struttura.
Ti hanno avvertito.
Maurus

 > anzichè


 Poi Doveva funzionare!
Micke,
ma tu li leggi i messaggi degli altri che cercano di aiutarti?
Mi sembra di no.
Rileggi bene tutto questo thread dove ti ho anche spiegato come si "quota"
ovvero come si manda un messaggio citando la parte di messaggio vecchio
sopra al proprio messaggio nel quale replichiamo.
Inoltre c'era anche il messaggio di Max:
"
Per la definizione di POD e altri risvolti della questione:
 
http://groups.google.com/groups?as_q=pod&as_ugroup=it.comp.lang.c%2b%2b
(Nota, in particolare, il thread con subject: "Salvare un oggetto su
file".)
Max
"
Quindi guarda nel link datoti, e studia, sia la definizione di POD sia come
salvare un oggetto su un file.
Ti hanno gia' spiegato che se anche ti funziona adesso non e' detto che ti
funzionera' per qualsiasi caso, il salvataggio su file con la soluzione che
tu hai impiegato.
Leggi i messaggi e non farti spiegare le stesse cose 10 volte.
Maurus