Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
14-74946
Undert
2002-11-30 12:50
2002.12.23
Помогите пожалуйста!!!!!


1-74800
Сергей
2002-12-11 14:18
2002.12.23
пример программного добавления папки и программ в меню Start->Pro


1-74807
TTCustomDelphiMaster
2002-12-11 15:16
2002.12.23
TAction то работает, то нет.


1-74758
Спрашивающий
2002-12-15 01:36
2002.12.23
Как возвести вещественное число в степень.


6-74874
Dimich1978
2002-10-29 14:30
2002.12.23
Запустить файл на удаленной машине?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский