Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.12.23;
Скачать: CL | DM;

Вниз

объект как 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.013 c
1-74745
skirdov
2002-12-14 16:23
2002.12.23
Фон формы


1-74683
olookin
2002-12-13 13:02
2002.12.23
Макросы


3-74611
Explorer
2002-12-05 10:30
2002.12.23
Курсор в DbGrid


1-74685
Gennadiy
2002-12-10 18:33
2002.12.23
Работа с текстовым файлом


1-74759
solo
2002-12-13 23:11
2002.12.23
Простой вопрос.