Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Указатели на калсс


Автор: ivan219 1.1.2008, 23:23
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  PMyClass = ^TMyClass;
  TMyClass = class
  public
    S: String;
    B: PMyClass;
    function A(C: PMyClass): PMyClass;
  end;

var
  Form1: TForm1;
  AClass: PMyClass;

implementation

{$R *.dfm}

function TMyClass.A(C: PMyClass): PMyClass;
begin
 Result := C;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 New(AClass);
 New(AClass^.B);
 AClass^.B^ := TMyClass.Create;
 AClass^ := TMyClass.Create;
 AClass^.S := 'asdf';
 Caption := AClass^.S;
 AClass^.B^.S := 'df';
 Caption := AClass^.A(AClass^.B)^.S;
 AClass^.B^.Free;
 AClass^.Free;
 Dispose(AClass^.B);
 Dispose(AClass);
end;

end.

Компилит но при выполнении ругается.

Что я зделал не так???

Автор: ivan219 1.1.2008, 23:38
Ругается на это:
Код

 AClass^.B^.S := 'df';
 Caption := AClass^.A(AClass^.B)^.S;
 AClass^.B^.Free;

Аесли закомертироват то не ругается и "работает".
Сообщение тира Read of Address (0000000) ...

Автор: kemiisto 1.1.2008, 23:54
Код

New(AClass);
New(AClass^.B);
AClass^.B^ := TMyClass.Create;
AClass^ := TMyClass.Create;


А надо бы:
Код

New(AClass);
AClass^ := TMyClass.Create;
New(AClass^.B);
AClass^.B^ := TMyClass.Create;


Сначала объект создаем, а уж потом обращаемся к свойствам - классика ООП, однако!

Автор: Alexeis 2.1.2008, 00:50
ivan219, указателей на класс не существует в принципе. Есть понятие о метаклассе, но судя по всему тут про другое. 
Код

 PMyClass = ^TMyClass;
  TMyClass = class


Это вообще не нужно! Переменная объект в делфи это и есть указатель. 

Автор: ivan219 2.1.2008, 00:58
Alexeis, ну а если мне надо сделать так:
Код

function A(B: TMyClass): TMyClass;
begin
 // Работа с B потом её вывод
 Result := B;
end;

то я буду работать стой переменной которую заганю в пораметр B: TMyClass ??

Вощемто всё это дело я затеил для того чтобы избавится от лишнего создания обектов и их копирования так как я пологаю мой код работает так:
сночало обект С копируется в B
Код

A(C);

потом я работаю с B
Код

function A(B: TMyClass): TMyClass;
begin
 // Работа с B
end;

и в конце он копируется в Result
Код

 Result := B;

Код

D :=A(C);

Т.е. происходит создание и копирование двух промежуточных обектов TMyClass или я не прав???

Добавлено через 7 минут и 29 секунд
kemiisto, всёравно ошибка.

Автор: Alexeis 2.1.2008, 01:20
Цитата(ivan219 @  2.1.2008,  00:58 Найти цитируемый пост)
Т.е. происходит создание и копирование двух промежуточных обектов TMyClass или я не прав???

  Совершенно неправ. Ни одного копирования. Это ж не С++. Скопировать объект это проблема в делфи. Причем бинарное копирование еще туда-сюда, если извратиться то можно, а чтобы правильно копировать нужно переопределить метод assign. 

Автор: ivan219 2.1.2008, 01:30
Alexeis
Код

  TMyClass = class
  public
    S: String;
    function A(C: TMyClass): TMyClass;
  end;

var
  Form1: TForm1;
  AClass: TMyClass;

implementation

{$R *.dfm}

function TMyClass.A(C: TMyClass): TMyClass;
begin
 C.S := '456';
 Result := C;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 AClass := TMyClass.Create;
 AClass.S := '123';
 AClass.A(AClass).S := '789';
 Caption := AClass.S; // В итоге получаем '789'
 AClass.Free;
end;

т.е. я везде:
Код

AClass.S := '123';

C.S := '456';

AClass.A(AClass).S := '789';

работаю только с переменно обекта AClass т.е. AClass.S := да???
получается что:
Код

AClass.S := '123';

C.S := '456';

AClass.A(AClass).S := '789';

с сылается на один и тотже адрес и равно сильно этому:
Код

AClass.S := '123';

AClass.S := '456';

AClass.S := '789';


Цитата(Alexeis @  2.1.2008,  01:20 Найти цитируемый пост)
Это ж не С++.

Кокраз изучаю smile

Цитата(Alexeis @  2.1.2008,  01:20 Найти цитируемый пост)
это проблема в делфи

а почему так сложно в Delphi если в C++ просто??

Автор: Alexeis 2.1.2008, 01:38
Цитата(ivan219 @  2.1.2008,  01:30 Найти цитируемый пост)
Кокраз изучаю smile 


  Оно и заметно. Переменная объекта это указатель. Любое присваивание по сути лишь присваивание указателя не более. 

Автор: ivan219 2.1.2008, 01:43
Цитата(Alexeis @  2.1.2008,  01:38 Найти цитируемый пост)
Переменная объекта это указатель. Любое присваивание по сути лишь присваивание указателя не более. 

Вроде разобрался спасибо +

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)