Przypisanie kopii a nie referencji

0

Hej
mam, pewną klasę stworzoną na podstawie TBGRASVG (akurat to jest mało istotne bo dotyczy ogółu).

Jest to klasa do obróbki obrazów. Nowy obraz tworzę:

img1:=TBGRASVG.Create();

ustawiam sobie parametry, wczytuje obraz itp. Teraz wykonuje coś takiego:

img2:=TBGRASVG.Create();
img1:=img2;
img1.Free;
img1:=nil;

Przy próbie wyświetlenia img2 oczywiście pojawia się błąd. Doszedłem już do tego, że takie przypisanie nie kopiuje wartości tylko odwołuje się do tego samego miejsca.

Wiem, że żeby stworzyć kopię dla img2 trzeba by użyć funkcji Assign jednak akurat ta klasa jej nie posiada.

Czy możecie mi podpowiedzieć jak do tej drugiej klasy przypisać kopię pierwszej tak aby pierwszą można było bezpiecznie usunąć?

Cholera człowiek tyle lat się bawi w programowanie a dalej ma problemy z podstawami :(

1

zmartwię Cię ale nie ma uniwersalnej metody na kopiowanie obiektów (poza chamskim kopiowaniem pamięci, ale to też może nie przejść jeśli składowymi klasy są inne klasy lub wskaźniki). Jeśli nie ma zaimplementowanej metody Assign to pozostaje Ci napisanie jej samemu.

0

Rozumiem, że jak przypisze cały obiekt do nowego to powstaje referencja a jak chce stworzyć kopię to muszę w funkcji Assign "przelecieć" wszystkie wartości i je po kolei przepisać?

1

Tak.

0

nie do końca wszystkie - żeby to zrobić prawidłowo trzeb znać filozofię danej klasy bo może się okazać, że ustawiając właściwość B zmienia (ustawia) on właściwość A i kolejność przepisywania powinna być taka - najpierw B a potem A. Co więcej część właściwości może być inicjowana przy tworzeniu obiektu a część zmiennych ustawianych przez metody. Dotyczyć to może w szczególności komponentów przechowujących grafikę bo tam przy wczytaniu obrazu mogą się dziać jakieś rzeczy, które w innych wypadkach nie zachodzą. Musisz spróbować - jak zadziała to dobrze, jak nie to trzeba szukać czym się różnią dwa obiekty po kopiowaniu.

0
abrakadaber napisał(a):

zmartwię Cię ale nie ma uniwersalnej metody na kopiowanie obiektów (poza chamskim kopiowaniem pamięci, ale to też może nie przejść jeśli składowymi klasy są inne klasy lub wskaźniki). Jeśli nie ma zaimplementowanej metody Assign to pozostaje Ci napisanie jej samemu.

Aj tam, od razu nie ma...
To co @karpov chce zrobić nazywa się deep copy ewentualnie clone object
A jak się już wie czego szukać, to można pogoglać.
Ludzie się bawili tym zagadnieniem jakieś 7/8 lat temu, kiedy pojawiło się nowe RTTI.

1 użytkowników online, w tym zalogowanych: 0, gości: 1