Форум: "Начинающим";
Текущий архив: 2006.03.19;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.013 c