Здравствуйте, tnikolai, Вы писали:
T>var x:^TMyClass; T>begin T>x:=@(TMyClass.Create());
T>Как получить ссылку на созданный класс? Или обязательно нужно его присвоить переменной типа TMyClass а потом взять её адрес?
А зачем вам ссылка на клас?
var
x: TMyClass; // это и так указатель на обьект!begin
x := TMyClass.Create();
D>var
D> x: TMyClass; // это и так указатель на обьект!
D>begin
D> x := TMyClass.Create();
D>
Не, это никак не указатель
мне этот класс возвращать из функции надо, а локальная переменная уничтожается.
Вначале возвращал ссылку на локальную переменную . Зато следующей строчкой вызывалась другая функция yyy. Делаю остановку на begin в yyy и смотрю на возвращёныый TMyClass — нормально. F8 — двигаюсь дальше на 1 строчку yyy, а в возвращённом TMyClass уже береберда какаято
D>>var
D>> x: TMyClass; // это и так указатель на обьект!
D>>begin
D>> x := TMyClass.Create();
D>>
T>Не, это никак не указатель
Учите мат часть, дорогой. Класы в Delphi всегда создаются и возвращаются как указатели
T>мне этот класс возвращать из функции надо, а локальная переменная уничтожается.
T>Вначале возвращал ссылку на локальную переменную . Зато следующей строчкой вызывалась другая функция yyy. Делаю остановку на begin в yyy и смотрю на возвращёныый TMyClass — нормально. F8 — двигаюсь дальше на 1 строчку yyy, а в возвращённом TMyClass уже береберда какаято
Блин, покажите заголовок функции которой пробуете вернуть обьект. И как пробуете, и во что потом пробуете присвоить.
D>Учите мат часть, дорогой. Класы в Delphi всегда создаются и возвращаются как указатели
И откуда ты это взял? D>Блин, покажите заголовок функции которой пробуете вернуть обьект. И как пробуете, и во что потом пробуете присвоить.
function xxx:TMyClass;
var x: TMyClass;
begin
x := TMyClass.Create();
result:=x;
end;
Это неправильно, надо возвращать тип ^TMyClass
Здравствуйте, tnikolai, Вы писали:
D>>Учите мат часть, дорогой. Класы в Delphi всегда создаются и возвращаются как указатели T>И откуда ты это взял? D>>Блин, покажите заголовок функции которой пробуете вернуть обьект. И как пробуете, и во что потом пробуете присвоить. T>function xxx:TMyClass; T>var x: TMyClass; T>begin T> x := TMyClass.Create(); T> result:=x; T>end; T>Это неправильно, надо возвращать тип ^TMyClass
Здравствуйте, tnikolai, Вы писали:
D>>Учите мат часть, дорогой. Класы в Delphi всегда создаются и возвращаются как указатели T>И откуда ты это взял?
Мдя. В новой объектой модели Delphi (в отличие от турбопаскаля) объекты всегда находятся в куче, а переменная типа объект — указатель на это место в куче. Статических объектов на стеке не бывает.
D>>Блин, покажите заголовок функции которой пробуете вернуть обьект. И как пробуете, и во что потом пробуете присвоить. T>function xxx:TMyClass; T>var x: TMyClass; T>begin T> x := TMyClass.Create(); T> result:=x; T>end; T>Это неправильно, надо возвращать тип ^TMyClass
Это правильно. Result указывает на объект в куче, а не на стеке.
---
The optimist proclaims that we live in the best of all possible worlds; and the pessimist fears this is true
function XXX : TMyClass;
begin
Result := TMyClass.Create;
end;
А вообще вот это работает:
TMyObject1 = object
constructor create(AValue : Integer);
procedure hello;
private
FValue : Integer;
end;
TMyClass = class
procedure Hello;
end;
...
{ TMyObject1 }
constructor TMyObject1.create(AValue : Integer);
begin
FValue := AValue;
end;
procedure TMyObject1.hello;
begin
showMessage ('Hello from object' + inttostr(FValue));
end;
{ TMyClass }
procedure TMyClass.Hello;
begin
ShowMessage ('hello from class');
end;
procedure TForm1.Button1Click(Sender: TObject);
function XXX_1 : TMyObject1;
var p : TMyObject1;
begin
p.create(100);
Result := p;
end;
function XXX_2 : TMyClass;
begin
Result := TMyClass.Create;
end;
var pp : TMyObject1;
begin
Здравствуйте, SergLA, Вы писали:
SLA>А еще можно написать
[Skip]
И в чем глубина сего примера?
В том что оно не упало при вызове конструктора? — повезло.
В том что при вызове метода Hello не используются поля класса и, соотвественно, Self может ссылатся куда хочет?
Написать можна много чего можно, но гарантию за то что оно будет работать стабильно вам никто не даст.
Здравствуйте, tnikolai, Вы писали:
T>var x:^TMyClass; T>begin T>x:=@(TMyClass.Create());
T>Как получить ссылку на созданный класс? Или обязательно нужно его присвоить переменной типа TMyClass а потом взять её адрес?
Дя, обязательно. TMyCreate.Create — r-value поэтому операция взятия адреса к нему не применима.
Здравствуйте, tnikolai, Вы писали:
T>var x:^TMyClass; T>begin T>x:=@(TMyClass.Create());
T>Как получить ссылку на созданный класс? Или обязательно нужно его присвоить переменной типа TMyClass а потом взять её адрес?
давайте с терминами определимся. класс — это тип и его методы скомпилированы внутрь EXE. классы — не создаются во время выполнения, так как типы существуют уже на этапе компиляции. создаются объекты — экземпляры класса. объект состоит из набора переменных (структуры) в куче (там лежат данные конкретного объекта), и ссылки на скомпилированные методы объекта (плюс ссылки на таблицы виртуальных и динамических методов, плюс еще по мелочи). переменная с типом являющимся классом — всегда указатель на структуру в памяти, про которую говорилось выше. если надо получить ссылку на объект класса — используется TMyClass. Если надо каким-то образом задать переменную "тип класса", используется определение:
type
TMyClassClass = class of TMyClass;
и ее уже использовать по принципу:
var
MyClass:TMyClass;
xclass: TMyClassClass;
begin
xclass:=TMyClass; // ссылается на тип
...
MyClass:=xclass.Create; // неявное создание. xclass выше может быть присвоен любой наследник TMyClass, любой из них будет создан здесь