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

Вниз

Method pointer в Object Pascal   Найти похожие ветки 

 
Sotlef   (2006-02-27 20:54) [0]

Вот начал изучать Делфи и нарвался на такую штуковину.
Ниже приведен листинг программы на Делфи
Если посмотреть дебагером в методе DoAction на @Self, то адрес один, который совпадает с адресом искомого объекта. А когда вызывается функция Operation, то в методе SomeMetod значение @Self будет другим (указывает вообще пока не ясно куда) и соотвественно я не могу работать с полями A.
Мне кажется, что моя ошибка в определении типа TOperation, компилятор его рассматривает как regular procedure и вызывает мой метод как обычную функцию, не заботясь о Self, а мне надо определить указатель на метод, чтобы все работало как надо. (по аналогии с С++). А как именно еще не знаю.

program Project1;

{$APPTYPE CONSOLE}

uses
SysUtils;

type
TOperation = function : Variant;

TMyObject = object
private
Operation : TOperation;
Value : Variant;
public
constructor Init(Method : TOperation; InitValue : Variant);
function SomeMetod : Variant;
function DoAction : Variant;
end;

constructor TMyObject.Init(Method : TOperation; InitValue : Variant);
begin
Operation := Method;
Value := InitValue;
end;

function TMyObject.SomeMetod : Variant;
begin
Result := Value;
end;

function TMyObject.DoAction : Variant;
begin
Result := Operation;
end;

var A : TMyObject;
begin
A.Init(@TMyObject.SomeMetod, 10);
writeln("Result = ", A.DoAction);
readln;
end.


 
begin...end ©   (2006-02-27 21:38) [1]

Если отвечать строго по вопросу, то решить проблему можно так:

type
 TOperation = function: Variant of object;

var
 A: TMyObject;
begin
 A.Init(@A.SomeMetod, 10);
 ...
end.

Однако не совсем понятно, какова цель всего этого, и почему используется тип object вместо class. Просьба пояснить, если не трудно.


 
begin...end ©   (2006-02-27 21:39) [2]

Сорри, собачка лишняя:

A.Init(A.SomeMetod, 10);


 
DesWind ©   (2006-02-27 21:46) [3]

Вопервых object это устаревший тип оставленый для совместимости. Щас все  классы потомки TObject;

Лучше сделать так


type
TMyObject=class(TObject)
 private
  Operation : TOperation;
  Value : Variant;
 public
  constructor Crete(Method : TOperation; InitValue : Variant);
  function SomeMetod : Variant;
  function DoAction : Variant;
end;
var
A: TMyObject;
begin
A:=TMyObject.Create();

end;



Вовторых TOperation орбъавлен как регулярная процедура

объявление типа-метода выглядит как

TOperation = procedure of object;


 
Sotlef   (2006-02-27 22:06) [4]

я его написал object-ом просто чтобы он был девственно чистым, без TObject-а :) И второй вопрос тогда в догонку, думаю очень простой - у TObject"a есть какие-нибудь поля, или там объявлены только методы? А то у меня в реальной программе будет очень много экземпляров одновременно висеть в памяти от аналогичного класса...


 
Sotlef   (2006-02-27 22:18) [5]

А на счет цели: я хочу интерпретатор написать, в нем будет базовый класс с абстрактным методом getValue. Потом объявить потомков. Например, один из них отвечает за переменные/константы и может просто возвращать значения, другой отвечает за обработку функций (пользовательских/встроенных). Для них уже надо будет вычислять значения, хотя с точки зрения базового класса это будет прозрачно... Класс для реализации обработки встроенных функций я возможно реализую способом, описанном в первом сообщении...


 
jack128 ©   (2006-02-27 22:18) [6]

Sotlef   (27.02.06 22:06) [4]
у TObject"a есть какие-нибудь поля, или там объявлены только методы?

а у тебя исходников VCL нету?? Сочувствую..  Нету у Tobject полей, только методы..


 
Гаврила ©   (2006-02-27 22:44) [7]


> Sotlef  


> я его написал object-ом просто чтобы он был девственно
> чистым

Не переживай
InstanceSize от TObject занимает всего 4 байта, можешь проверить. Именно столько и будет отъедаться памяти на каждый созданный экземпляр (кроме, разумеется, твоих добавлений)



Страницы: 1 вся ветка

Текущий архив: 2006.03.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.085 c
2-1141452138
Ezorcist
2006-03-04 09:02
2006.03.19
Недавняя олимпиада для школьников по прграммерству


15-1140190739
lak-b
2006-02-17 18:38
2006.03.19
Win Xp - порблемы с сетью


9-1126424094
Signate
2005-09-11 11:34
2006.03.19
GLScene - начало


1-1140177054
pargo
2006-02-17 14:50
2006.03.19
FreeLibrary -> Invalid pointer operation


6-1133858903
Alexandr
2005-12-06 11:48
2006.03.19
выбор технологии для обмена данными