Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

объект как var - параметр [D5, NT4]


oomneeq ©   (2002-12-12 19:36:00) 

Дорогие теоретики, вот два варианта
type TMyObj=class ...

1)Procedure Foo( varAnObj:TMyObj)

2)Procedure Foo(AnObj:TMyObj)

на мой взгляд var в 1) абсолютно ни к чему - объект ведь

но как бы это саргументировать повесче?


oomneeq   (2002-12-13 01:24:00) [1]

2 Fantasist
Я cпециально оговорился, что обращался к теоретикам :-)
Аргументация нужна была для убеждения коллег

>Нужно делать так как нужно.
понял!




Fantasist   (2002-12-12 21:46:00) [2]


> кто больше? :=)


Извращение какое-то. Если не нужно менять переменную, то не нужно передовать ее как var(мы говорим толькоо переменных типа class), а если нужно, то и передавать нужно как var. Зачем тут какие-то аргументы? Нужно делать так как нужно.
А то ведь можно и через ассемблерную вставку процедуру вызвать и параметр передать - тоже вроде и не мешает и разницы никакой...


Сергей Бушин   (2002-12-12 20:23:00) [3]

Бурундук (12.12.02 20:07)

// с помощью var можно изменить ссылку параметр:
AnObj := AnotherObj;
AnObj := TXXX.Create;
AnObj := nil;

Я именно это ввиду и имел.


oomneeq   (2002-12-12 20:14:00) [4]

2Сергей Бушин © (12.12.02 19:57)
Это описание фактов
(слегка двусмысленное причем - неясно что понимать
под "локальная копия переменной (объекта)"
можно подуматЬ, что экземпляр, а это ведь далеко не так)

А аргУмент где?

я уточню по ходу, что менять сам параметрAnObj в намерения не входит, объект передаётся в процедуру параметром, чтоб обращаться внутри ее к свойствам и методам объекта.
т.е. нужды в var нету, а наличие var вроде как не мешает.
доступиться внутри процедуры к обхекту можно в обоих случаях
Единственными аргументами против var, приходящими на ум являются:
1)возможность нечаянно таки модифицировать саму ссылку AnObj и потерять обхект
2)невозможность передавать в процедуру наследников (без явного приведения типа), т.к. вар - параметр требует точного соответствия типов

кто больше? :=)


Бурундук   (2002-12-12 20:07:00) [5]

Сергей Бушин © (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;


Сергєєв Володимир   (2002-12-12 19:59:00) [6]

Как-то мне требовалось передавать в процедуры и объкты и поля объектов в качестве ВАР-параметров. Но делфя ругается при компиляции и говорит, что поле объекта не может быть передано в качестве вар параметра.
Выход я тогда нашел в том, что объявляю тип
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 19:57:00) [7]

В первом случае в процедуру передается адрес на данный объект и все изменения сделанные внутри метода с данной переменной (объектом) отобразяться и на исходной переменной (объекте).
Во втором случае, создается локальная копия переменной (объекта) и все изменения производимые внутри метода, не каснутся исходной переменной.


Наверх

Титульная страница Поиск, карта сайта Написать письмо