Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Внизобъект как var - параметр Найти похожие ветки
← →
oomneeq (2002-12-12 19:36) [0]Дорогие теоретики, вот два варианта
type TMyObj=class ...
1)Procedure Foo( var AnObj:TMyObj)
2)Procedure Foo(AnObj:TMyObj)
на мой взгляд var в 1) абсолютно ни к чему - объект ведь
но как бы это саргументировать повесче?
← →
Сергей Бушин (2002-12-12 19:57) [1]В первом случае в процедуру передается адрес на данный объект и все изменения сделанные внутри метода с данной переменной (объектом) отобразяться и на исходной переменной (объекте).
Во втором случае, создается локальная копия переменной (объекта) и все изменения производимые внутри метода, не каснутся исходной переменной.
← →
Сергєєв Володимир (2002-12-12 19:59) [2]Как-то мне требовалось передавать в процедуры и объкты и поля объектов в качестве ВАР-параметров. Но делфя ругается при компиляции и говорит, что поле объекта не может быть передано в качестве вар параметра.
Выход я тогда нашел в том, что объявляю тип
type
PMyClass = ^TMyClass;
TMyClass = class(...)
.....
end;
а дальше
procedure DoSomething(PointerToObject :PMyClass);
begin
PointerToObject^.SomeFiled := .....;
end;
и вызываю как
var
MyObj :TMyClass;
begin
MyObj.Create(...);
.......
DoSomething(@MyObject);
......
end;
Таким образом можно обойти проблему ВАР-параметров и передавать в процедуры практически что угодно. Единственное - самому нужно следить в коде, чтобы объект(поле), адрес которого передается в процедуру, на момент передачи его адреса был создан, а то поймаешь Access violation at address ....
← →
Бурундук (2002-12-12 20:07) [3]Сергей Бушин © (12.12.02 19:57)
Тут Вам не здесь (не С++ в смысле)
Объекты в паскале по значению не передаются.
AnObj - это уже сама по себе ссылка на объект.
var имеет смысл, если в процедуре нужно изменить
эту ссылку (а не объект), напр.
procedure Foo(var AnObj:TMyObj);
begin
// с помощью var можно изменить ссылку параметр:
AnObj := AnotherObj;
AnObj := TXXX.Create;
AnObj := nil;
// На обращение к объекту var никак не влияет
AnObj.XXX();
end;
← →
oomneeq (2002-12-12 20:14) [4]2Сергей Бушин © (12.12.02 19:57)
Это описание фактов
(слегка двусмысленное причем - неясно что понимать
под "локальная копия переменной (объекта)"
можно подуматЬ, что экземпляр, а это ведь далеко не так)
А аргУмент где?
я уточню по ходу, что менять сам параметр AnObj в намерения не входит, объект передаётся в процедуру параметром, чтоб обращаться внутри ее к свойствам и методам объекта.
т.е. нужды в var нету, а наличие var вроде как не мешает.
доступиться внутри процедуры к обхекту можно в обоих случаях
Единственными аргументами против var, приходящими на ум являются:
1)возможность нечаянно таки модифицировать саму ссылку AnObj и потерять обхект
2)невозможность передавать в процедуру наследников (без явного приведения типа), т.к. вар - параметр требует точного соответствия типов
кто больше? :=)
← →
Сергей Бушин (2002-12-12 20:23) [5]Бурундук (12.12.02 20:07)
// с помощью var можно изменить ссылку параметр:
AnObj := AnotherObj;
AnObj := TXXX.Create;
AnObj := nil;
Я именно это ввиду и имел.
← →
Fantasist (2002-12-12 21:46) [6]
> кто больше? :=)
Извращение какое-то. Если не нужно менять переменную, то не нужно передовать ее как var(мы говорим только о переменных типа class), а если нужно, то и передавать нужно как var. Зачем тут какие-то аргументы? Нужно делать так как нужно.
А то ведь можно и через ассемблерную вставку процедуру вызвать и параметр передать - тоже вроде и не мешает и разницы никакой...
← →
oomneeq (2002-12-13 01:24) [7]2 Fantasist
Я cпециально оговорился, что обращался к теоретикам :-)
Аргументация нужна была для убеждения коллег
>Нужно делать так как нужно.
понял!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.12.23;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c