Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
11-1122024147
Ajax
2005-07-22 13:22
2006.03.19
KOL DC-DSP Audio


15-1140954049
постигаю
2006-02-26 14:40
2006.03.19
меняющаяся ячейка


2-1141306136
Layner
2006-03-02 16:28
2006.03.19
Как выбрать записи из таблицы без обращения к серверу?


1-1139665323
Dima1
2006-02-11 16:42
2006.03.19
Как в TRichEdit увеличить текст


2-1141120783
VitV
2006-02-28 12:59
2006.03.19
Interbase. Путь к рисунку.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский