Newsgroup: it.comp.lang.c++
Titolo: Tanto per incasinarmi la vita!

Dinnanzitutto ringrazio tutti per le risposte nella precedente domanda!
Come al solito quando un programmatore passa dal VB al VC++ ne combina di
tutti i colori.
Infatti, abituato alle comodità del VB ho deciso di creare una struttura
dati abbastanza complessa, ma trovando grossi problemi a fare classi
contenenti strutture CMap, ho deciso di optare (ignaro dei risultati )per la
seguente:
Una variabile globale:
CMap(long,long,MiaClasse,MiaClasse) colProfilo;
Una classe:
class MiaClasse
{
    lista1 *oggcoll;
    lista2 *oggcoll;
    int ID;
}
Un'altra classe:
class oggcoll
{
    long Valore;
    oggcoll *Prossimo;
    oggcoll *Precedente;
}
In pratica ho una collection globale che per un valore long, mi ritorna
un'istanza della MiaClasse .
Quest'ultima ha due liste di oggetti di tipo oggcoll, ognuno dei quali ha un
collegamento al prossimo e al precedente; l'ultimo punta a NULL;
Ora:
La creazione della classe, l'inserimento dei dati ed il collegamento degli
elementi va tutto bene.
Quando arrivo all'istruzione:
colProfilo.SetAt(10,IstanzaMiaClasse);
iniziano i casini:
cambiano i valori della variabile "Valore" in ogni oggetto collegato,
si perdono alcuni puntatori...
e se provo a creare una nuova istanza:
MiaClasse Nuovaistanza = new MiaClasse();
colProfilo.Lookup(10,*Nuovaistanza);
eseguendo in debug, in ogni passo mi cambiano i valori, si perdono puntatori
dell'altra istanza che avavo usato in inserimento nella collection.
Io dico: se inserisco una classe A con ID 10, creo una nuova istanza B ed
estraggo dalla collection la classe con ID 10 in B, alla fine B dovrebbe
essere uguale ad A puntatori compresi.
Tra l'altro nella classe MiaClasse ho aggiunto il costruttore ed il
distruttore.
Il costruttore setta i due puntatori a NULL
il distruttore fa un delete per ogni oggetto nelle due liste.
Scusate la lunghezza della spiegazione, ma effettivamente la situazione è
abbastanza complicata.
Qualcuno sa spiegarmi come mai succedono queste cose?
Oppure sapete dirmi cosa devo usare per mantenere i collegamenti esatti?
Vi ringrazio sempre per la pazienaza!
Pivanti Marco

Per chi fosse interessato ho trovato la soluzione:
sta nell'usare una classe CTypedPtrMap invece della CMap,
In questo modo passo solo puntatori a classi che rimangono ben stabili
all'interno della collection.

 wrote in message
news:10008273...@silvia.ihnet.it...

Sia CTypedPtrMap che CMap sono classi che non fanno parte dello standard.
In ogni caso se usi una mappa di puntatori attento alle allocazioni e
deallocazioni: sei a rischio di memory leaks.
Il problema che avevi riscontrato si risolve definendo correttamente la tua
classe (ovvero definendo il copy constructor e il copy operator).
--
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

Scusa:
1- che cosa intendi per memory leaks? cosa mi puo comportare ecc...
2- Sti benedetti copy constructor e copy operator, li so definire, ma dentro
cosa ci devo mettere?

 cosa ci devo mettere?
Ovviamente il codice per eseguire una copia della classe nei due modi in cui
questo puo' essere fatto, ovvero costruendo un nuovo oggetto che e' una copia di
un oggetto dato o assegnando ad un oggetto il la copia del contenuto di un altro
(eliminano il contenuto che l'oggetto aveva precedentemente).


Solo un'ultima cosa, visto che sei cosě gentile a darmi queste spiegazioni.
Inizialmente non avevo optato per le liste ma per una CMap che conteneva
istanze di una mia classe la quale doveva contenere altre CMap invece che
delle liste.
Ho avuto problemi proprio per questi copy constructor e per l'overload
dell'operatore = che sono richiesti proprio dall'interno delle funzioni
della CMap.
Il problema principale č che non so come copiare le CMap all'interno della
mia classe e ancora peggio non so cosa mettere per l'operatore =.
Se per te non č un problema, potresti farmi un piccolo esempio oppure darmi
due dritte sul meccanismo di questi operatori?
Ti ringrazio in anticipo!
Pivanti Marco

 due dritte sul meccanismo di questi operatori?
Non posso perche' CMap non fa parte dello standard e non la conosco. (tra
parentesi parlare della CMap e' OT in questo NG. Chiedi in
it.comp.programmare.win32).
Potrei fare qualche cosa di piu' se tu usassi std::map, ma non vorrei portarti
in direzione di cose che ti complicano la vita (se non conosci i template e lle
STL non e' detto che std::map possa essere piu' semplice che la tua CMap).


Grazie lo stesso!!!