Newsgroup: it.comp.lang.delphi
Titolo: Distruttore - Chiedo consiglio...

ciao a tutto il ng.
ieri vi ho chiesto aiuto su i costruttori e vi ringrazio per la soluzione e
discussioni istuttive.
oggi vi chiedo aiuto sul distruttore, e se sto scrivendo codice giusto o
robusto.
chiedo scusa per questa ulteriore richiesta d'aiuto ma purtroppo la
documentazione in mio possesso a volte non è molto chiara ed io sono alle
prime armi con la OO di delphi.
---------------------------------------una classe--------------------
TOggetto1 = class (TObject)
private
    x : integer;
public
    constructor create;
    destructor destroy;
end;
constructor TOggetto1.Create;
begin
    inherited create;
    x := 0;
end;
destructor TOggetto1.destroy;
begin
  inherited destroy;
end;
------------------------------------------------------------------------
TOggetto2 = class (TObject)
public
    unOggetto : TOggetto1;
    constructor   create;
    destructor    destroy;
end;
constructor TOggetto2.create;
begin
    inherited create;
    unOggetto := TOggetto1.create;
end;
destructor TOggetto2.destroy;
begin
    inherited destroy;
    FreeAndNil(unOggetto);
end;

end;
Questo non va bene:
destructor TOggetto2.destroy;
begin
    FreeAndNil(unOggetto);
    inherited destroy;
end;
Il principio e`:
1. si crea il genitore;
2. si crea il figlio;
3. si distrugge il figlio;
4. si distrugge il genitore;


non capisco....
nel riquadro "Questo va bene"
viene distrutto TObject (inherits destroy) e poi l'oggetto (unOggetto)?
non mi quadra... per favore mi aiuti a capire?
comunque prendo per buono i tui consigli ma solo che vorrei capire meglio
secondo la mia *bacata* logica...
io distruggo prima "unOggetto" perchč dichiarato in TOggetto2 e instanziato
in TOggetto2.create,
poi...
fatto questo allora distruggo TObject
facendo l'incontrario (come mi dici)
distruggo TObject che contiene "unOggetto" - in questo caso non perdo il
puntatore a "unOggetto"?
ciao e grazie molte
roberto

nel riquadro "Questo va bene"
Hai inteso male, i miei commenti sono rivolti sempre alla parte
quotata al di sopra.

Ok grazie!
ancora una cosa e poi la pianto...
giusto per capire
in un form provo le classi e ci ho messo un memo che mi spara messaggi su
cosa sta succedendo con i miei 2 oggetti.
perchč gli oggetti instanziati non vengono distrutti con free? ma devo
metterci b.destroy?
free  non dovrebbe chiavare automaticamente il distruttore?
es:
procedure TForm1.Button1Click(Sender: TObject);
var
  b : ogg2;
begin
  b := ogg2.create;
  //b.Free;
  b.destroy;
end;
ciao
roberto
"Andrea Laforgia" <x@x.x> ha scritto nel messaggio
news:b9lpuuscgbr62sbef...@4ax.com...


metterci b.destroy?
Perche`, in OOP, i distruttori delle classi madri, se si usa il
polimorfismo (in Delphi si usa SOLO il polimorfismo) devono SEMPRE
essere virtuali e quindi devi farne l'override nelle classi derivate:
type TClasse1 = class (TObject)
                private
                    x : integer;
                public
                    constructor create;
                    destructor destroy; override;
                end;
constructor TClasse1.Create;
begin
  Form1.Memo1.Lines.Add('prima del create del genitore di TClasse1');
  inherited create;
  Form1.Memo1.Lines.Add('dopo il create del genitore di TClasse1');
  x := 0;
end;
destructor TClasse1.destroy;
begin
  Form1.Memo1.Lines.Add('prima del destroy del genitore di TClasse1');
  inherited destroy;
  Form1.Memo1.Lines.Add('prima il destroy del genitore di TClasse1');
end;
type
  TClasse2 = class
             public
               unOggetto: TClasse1;
               constructor   create;
               destructor    destroy; override;
             end;
constructor TClasse2.create;
begin
  Form1.Memo1.Lines.Add('prima del create del genitore di TClasse2');
  inherited create;
  Form1.Memo1.Lines.Add('dopo il create del genitore di TClasse2');
  unOggetto := TClasse1.create;
end;
destructor TClasse2.destroy;
begin
  Form1.Memo1.Lines.Add('prima del destroy del genitore di TClasse2');
  inherited destroy;
  Form1.Memo1.Lines.Add('dopo il destroy del genitore di TClasse2');
  FreeAndNil(unOggetto);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  A: TClasse2;
begin
  Form1.Memo1.Lines.Add('prima del create di TClasse2');
  A := TClasse2.Create;
  Form1.Memo1.Lines.Add('dopo il create di TClasse2');
  Form1.Memo1.Lines.Add('prima del free di TClasse2');
  A.Free;
  Form1.Memo1.Lines.Add('dopo il free di TClasse2');
end;
L'output che ottengo:
prima del create di TClasse2
prima del create del genitore di TClasse2
dopo il create del genitore di TClasse2
prima del create del genitore di TClasse1
dopo il create del genitore di TClasse1
dopo il create di TClasse2
prima del free di TClasse2
prima del destroy del genitore di TClasse2
dopo il destroy del genitore di TClasse2
prima del destroy del genitore di TClasse1
prima il destroy del genitore di TClasse1
dopo il free di TClasse2

free  non dovrebbe chiavare automaticamente il distruttore?
                    ^^^^^^^
ROTFL!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Morde :-D

 >perchč gli oggetti instanziati non vengono distrutti con free? ma devo
