Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на калсс, Вопросы. 
V
    Опции темы
ivan219
  Дата 1.1.2008, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



Код

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:44
PM MAIL ICQ   Вверх
ivan219
  Дата 1.1.2008, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



Ругается на это:
Код

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

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

Это сообщение отредактировал(а) ivan219 - 1.1.2008, 23:46
PM MAIL ICQ   Вверх
kemiisto
Дата 1.1.2008, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 2
Всего: 160



Код

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


А надо бы:
Код

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


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


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Alexeis
Дата 2.1.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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

 PMyClass = ^TMyClass;
  TMyClass = class


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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 2.1.2008, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



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, всёравно ошибка.

Это сообщение отредактировал(а) ivan219 - 2.1.2008, 01:03
PM MAIL ICQ   Вверх
Alexeis
Дата 2.1.2008, 01:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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

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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 2.1.2008, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



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++ просто??

Это сообщение отредактировал(а) ivan219 - 2.1.2008, 01:37
PM MAIL ICQ   Вверх
Alexeis
Дата 2.1.2008, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 34
Всего: 459



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


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



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ivan219
  Дата 2.1.2008, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

Репутация: 5
Всего: 12



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

Вроде разобрался спасибо +
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0953 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.