Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Вниз

Копирование объектов.   Найти похожие ветки 

 
АлексейК   (2003-12-23 13:50) [0]

Задача
A, B:TXClass
A:=TXClass.Create;
присваем начение полям, свойствам объекта А
Теперь нужно создать копию обекта А и присвоить ему указатель В, или выполнить В:=TXClass.Create, а затем значение полей и свойств В привести в такое же состояние как у А.
Объект класса TXClass не имеют метода Assign или подобного.
Кому нетрудно, предложите варианты решения.


 
Юрий Федоров   (2003-12-23 14:05) [1]

Напиши для TXClass метод Assign или подобный :-))


 
MBo   (2003-12-23 14:08) [2]

Наследуйся от TPersistent и реализуй Assign(To)


 
АлексейК   (2003-12-23 15:22) [3]

Ну кроме Assign что-нибудь, например, загнать объект в поток, потом восстановить из потока.


 
DiamondShark   (2003-12-23 18:06) [4]


> например, загнать объект в поток, потом восстановить из
> потока.

А метод, который это делает, назвать Assign


 
Юрий Зотов   (2003-12-23 18:28) [5]

> АлексейК

> Объект класса TXClass не имеют метода Assign или подобного.

Значит, он не является наследником TPersistent.

> Ну кроме Assign что-нибудь, например, загнать объект в поток,
> потом восстановить из потока.

А вот для этого он как раз ДОЛЖЕН являться наследником TPersistent. Но тогда он будет иметь метод Assign. И, скорее всего, замещение Assign будет более простым решением, чем копирование через поток (особенно, если класс содержит нестандартные свойства).

Впрочем, есть решение ОЧЕНЬ простое - Move или CopyMemory. Но не советую. Например, если объект содержит ссылочные поля, длинные строки или динамические массивы, то такой способ чреват проблемами.


 
MBo   (2003-12-24 06:47) [6]

Если что-то выглядит, как TPersistent, пахнет, как TPersistent, и должно работать, как TPersistent, то его и надо делать наследником TPersistent.

> например, загнать объект в поток, потом восстановить из потока.
А это уже на Tcomponent смахивает ;)


 
АлексейК   (2003-12-24 08:31) [7]

Например, если объект содержит ссылочные поля, длинные строки или динамические массивы, то такой способ чреват проблемами.
Прочитал, подумал - точно не все так просто. Просто вспомнилась книжка по Borland C++ 3.1, где писалось, что если объект передается параметром в функцию, то передается его копия, и изменения значения полей последней не приводит к изменению значений полей объекта.


 
Digitman   (2003-12-24 10:53) [8]


> если объект передается параметром в функцию, то передается
> его копия


смотря что считать "объектом"

некая структура тоже может считаться "объектом", но механизм ее передачи факт.параметром ф п/программу вполне подконтролен

если же под "объектом" считать объект-наследник класса TObject, то такой объект никогда не передается ни в оригинале ни копией - передается либо ссылка (адрес местонахождения экз-ра в памяти процесса) либо копия ссылки на него


 
Nikolay M.   (2003-12-24 11:01) [9]


> передается либо ссылка (адрес местонахождения экз-ра в памяти
> процесса) либо копия ссылки на него

А если не секрет, что такое "копия ссылки", если это не неточность формулировки? Некоторая переменная либо равна адресу, по которому находится объект в памяти, либо нет. Какие из переменных считать ссылками на объект, а какие - их копиями?


 
Digitman   (2003-12-24 11:28) [10]


> Nikolay M. © (24.12.03 11:01) [9]


рассмотрим простой пример

var
A, B: TComponent;
...
A := TComponent.Create(nil); A.Name := "A";
B := TComponent.Create(nil); B.Name := "B";

1) "передача объекта" по "оригинальной" ссылке :

procedure SetObjName( var Obj: TComponent);
begin
Obj := B;
end
...
SetObjName(A);
Showmessage(A.Name); // "B"
Showmessage(B.Name); // "B"

2) "передача объекта" по "копии ссылки" :

procedure SetObjName(Obj: TComponent);
begin
Obj := B;
end
...
SetObjName(A);
Showmessage(A.Name); // "A"
Showmessage(B.Name); // "B"


 
Digitman   (2003-12-24 11:34) [11]

"передача объекта" намерено взята в кавычки, потому что на самом деле происходит передача не собственно объекта, а либо адреса (1) либо значения (2) переменной, хранящей ссылку на некий объект

в принципе, и в том и в другом случае происходит копирование (либо в стек либо в регистр) соответствющих случаям (1) и (2) значений, но модификация "временной копии" в случае (2) не влияет на содержимое "оригинала"


 
Digitman   (2003-12-24 11:38) [12]

еще точней будет сказать, что в случае (1) происходит передача косвенной ссылки на адрес объекта, в то время как в (2) происходит передача прямого указателя на адрес объекта


 
Nikolay M.   (2003-12-24 11:40) [13]


> Digitman © (24.12.03 11:28) [10]

Позволю не согласиться. Во втором случае будет не "копия ссылки", а "ссылка на копию объекта".


 
Sandman25   (2003-12-24 11:45) [14]

[13] Nikolay M. © (24.12.03 11:40)

Объект тот же самый. Именно копия ссылки.


 
Digitman   (2003-12-24 11:50) [15]


> Nikolay M. © (24.12.03 11:40) [13]


где ты вообще здесь видишь копирование объекта ?


 
Nikolay M.   (2003-12-24 12:01) [16]

Да, конечно копия ссылки, согласен. Утреннее помутнение, не иначе.
10Х :)



Страницы: 1 вся ветка

Форум: "Потрепаться";
Текущий архив: 2004.01.16;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.01 c
3-49463
rtooo
2003-12-19 01:12
2004.01.16
Как немного автоматизировать базу


1-49520
velial
2004-01-03 10:59
2004.01.16
p2p приложение


14-49764
Думкин
2003-12-24 00:07
2004.01.16
С днем рождения! 24 декабря.


1-49570
raining day
2004-01-05 21:07
2004.01.16
Не могу нормально записать инфу в реестр


1-49553
Zeus_Chess
2004-01-06 10:19
2004.01.16
ПАТЧЕВАНИЕ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский