Текущий архив: 2003.08.25;
Скачать: CL | DM;
Вниз
Создание копии объекта Найти похожие ветки
← →
Юрий Федоров © (2003-08-14 17:13) [0]Добрый день.
Хочу создать копию объекта.
Объект-источник на самом деле является потомком от TMyClass.
Пишу так :
function TMyClass.CreateCopy: TMyClass;
begin
Result:=TMyClass(ClassType.NewInstance);
Result.Create(список параметров);
Result.Assign(Self);
end;
Вопрос:
можно ли так писать? У меня подозрение, что
Result.Create
повторно вызоветNewInstance
и это приведет к двойному выделению памяти
← →
reonid © (2003-08-14 17:15) [1]Не приведёт.
Конструктор вызовется как простой метод
← →
Marser © (2003-08-14 18:02) [2]Для использования Assign клас должен быть потомком TPersistent.
← →
Игорь Шевченко © (2003-08-14 18:06) [3]Marser © (14.08.03 18:02)
Или у него должен быть свой собственный метод Assign :)))
← →
Юрий Федоров © (2003-08-14 18:09) [4]У меня собственный :-)
← →
vuk © (2003-08-14 18:41) [5]Если конструктор не виртуальный, то вызовется конструктор TMyClass, что при вызове метода в потомках может вызвать неверную инициализацию. А если конструктор виртуальный, то не понятно, зачем нужен явный вызов NewInstance.
← →
Юрий Федоров © (2003-08-14 18:48) [6]>>vuk © (14.08.03 18:41) [5]
Конструктор разумеется виртуальный.
Насчет явного вызова - NewInstance -
я не знаю, конструктор для какого класса вызывать. То есть нужно вызвать конструктор для моего текущего класса, но...
Конструктор, вызванный через ClassType не принимает параметров, а у меня они есть. Попытка типизировать успехом не увенчалась.
Вообще-то похоже, что так можно, очень похожая вещь написана в Application.CreateForm
← →
vuk © (2003-08-14 18:52) [7]
type
TMyClassRef = class of TMyClass;
...
function TMyClass.CreateCopy: TMyClass;
begin
Result := TMyClassRef(Self.ClassType).Create({params});
end;
← →
Юрий Федоров © (2003-08-14 19:06) [8]>>vuk © (14.08.03 18:52) [7]
Да уж... Видимо когда я проверял этот вариант, конструктор еще виртуальным не был, и я запомнил что мне что-то не понравилось.
Впрочем ясно одно - пора пойти попить пивка и отдохнуть :-)
← →
vuk © (2003-08-14 19:27) [9]>конструктор еще виртуальным не был
Ну так если конструктор не виртуальный, то что в первом варианте, что во втором, результат один будет.
← →
хм © (2003-08-14 19:33) [10]
function Clone(obj:TObject):TObject;
var Size:Cardinal;
begin
if Assigned(obj) then
begin
Size:=Obj.InstanceSize;
GetMem(Pointer(Result),Size);
CopyMemory(Pointer(result),Pointer(obj),Size);
Result.AfterConstruction;
end
else Result:=nil;
end;
← →
vuk © (2003-08-14 19:43) [11]to хм:
Вот так уж точно не стоит. С таким подходом можно нарваться на разные нехорошие эффекты, связанные с внутренним функционированием экземпляров разных (вложенные объекты, различные нотификации и счетчики ссылок).
← →
vuk © (2003-08-14 19:45) [12]>экземпляров разных
должно быть "экземпляров разных классов"
← →
хм © (2003-08-14 19:54) [13]Ну у меня инициализация вложенных объектов в AfterConstruction всегда.
← →
Camus © (2003-08-14 20:07) [14]> хм © (14.08.03 19:54) [13]
А счетчики ссылок строковых полей Вы тоже увеличиваете вручную?
← →
default © (2003-08-14 21:16) [15]Camus © (14.08.03 20:07) [14]
да ерунда такое копирование)
← →
хм © (2003-08-14 21:42) [16]>Camus © (14.08.03 20:07) [14]
На универсальность не претендую.
← →
vuk © (2003-08-14 21:45) [17]to хм:
>На универсальность не претендую.
Зато на кучу багов - легко.
← →
хм © (2003-08-14 21:51) [18]>vuk © (14.08.03 21:45) [17]
Претендую, но их нету.
← →
vuk © (2003-08-14 21:53) [19]to хм:
>Претендую, но их нету.
Вы предлагаете (как универсальное) решение, которое работает только в ограниченном количестве случаев. Что Вы на баги не нарвались - Ваше исключительное везение.
← →
хм © (2003-08-14 21:58) [20]>vuk © (14.08.03 21:53) [19]
>Вы предлагаете (как универсальное) решение ...
>хм © (14.08.03 21:42) [16]
>На универсальность не претендую.
← →
vuk © (2003-08-14 22:02) [21]Звиняюсь, немного уже крыша к вечеру съезжает. :o)
Но тогда неуниверсальность и условия работоспособности кода надо было сразу оговаривать.
← →
Юрий Зотов © (2003-08-14 23:13) [22]> хм © (14.08.03 21:51) [18]
> Претендую, но их нету.
Точнее было бы сказать - пока они не проявились. А уж есть они, или их нет - это неизвестно.
← →
хм © (2003-08-15 00:37) [23]У меня ни в одном объекте стрингов нет. Все остальное инициализуется в AfterConstruction.
p.s Может хватит, а?
Страницы: 1 вся ветка
Текущий архив: 2003.08.25;
Скачать: CL | DM;
Память: 0.52 MB
Время: 0.015 c