Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];
Внизвызов функции-члена класса Найти похожие ветки
← →
Толик (2002-03-26 17:07) [0]Проблема такая: есть несколько объектов, нужно для всех них вызвать один из их методов. Проблема в том, что заранее неизвестно, какой из методов надо вызывать. В С++ проблема решается так:
class TMyClass{
private:
int val;
public:
TMyClass(const int i){val = i};
void mem_fnc(){/*вывод зн-я val*/};
};
void Main(void){
//объявляем тип указателя на ф-ю класса TMyClass
typedef void __fastcall(TMyClass::*pmf)();
//получаем адрес ф-и mem_fnc
pmf p = &TMyClass::mem_fnc;
TMyClass1* pMC1 = new TMyClass1(1);
TMyClass2* pMC2 = new TMyClass2(2);
//вызов ф-и mem_fnc через указатель
(pMC1->*p)(); //получаем значение "1"
(pMC2->*p)(); //получаем значение "2"
delete pMC1;
delete pMC2;
}
А вот теперь внимание ВОПРОС: как сделать то же самое в Делфях???
Проблема в том, что следующий пример НЕ РАБОТАЕТ!
TProc = procedure()of object;
var
Proc: TProc;
MC1, MC2: TMyClass;
begin
MC1 := TMyClass.Create(1);
MC2 := TMyClass.Create(2);
Proc := MC1.mem_fnc;
{Вот здесь-то и проблема, т.к. Proc указывает на на ф-у mem_fnc ТОЛЬКО переменной MC1, в то время как в предыдущем примере p указывает на ф-ю mem_fnc ЛЮБОЙ переменной типа TMyClass}
MC1.Free();
MC2.Free();
end;
Дошло уже до того, что я объявлял эту ф-ю как виртуальную и через ClassType(), получая указатель на vmt, искал там нужную ф-ю и вызвал её. Всё работало до тех пор, пока ф-я не использовала переменные-члены-класса. Как вызывать ф-и члены класса из vmt я пока так и не понял. Help me pls...
← →
DieHard (2002-03-26 17:13) [1]F1 Class methods
← →
reonid (2002-03-26 17:14) [2]указатель на метод в Дельфи представляет собой след. структуру
TMethod = record
Code, Data: Pointer;
end;
Proc := SomeObj.mem_fnc;
TMethod(Proc).Data := OtherObj;
Proc(); {OtherObj.mem_fnc}
← →
McSimm (2002-03-26 17:22) [3]type
TProc = function: Integer of object;
var
Proc: TProc;
MC1, MC2: TMyClass;
begin
...
TMethod(Proc).Code := @TMyClass.mem_fnc;
TMethod(Proc).Data := MC1;
ShowMessage(IntToStr(proc));
TMethod(Proc).Data := MC2;
ShowMessage(IntToStr(proc));
← →
oomneeq (2002-03-26 17:52) [4]>TProc = procedure()of object;
>var
> Proc: TProc;
> MC1, MC2: TMyClass;
>begin
> MC1 := TMyClass.Create(1);
> MC2 := TMyClass.Create(2);
> Proc := MC1.mem_fnc;
>{Вот здесь-то и проблема, т.к. Proc указывает на на ф-у mem_fnc >ТОЛЬКО переменной MC1, в то время как в предыдущем примере p >указывает на ф-ю mem_fnc ЛЮБОЙ переменной типа TMyClass}
> MC1.Free();
> MC2.Free();
>end;
mem_fnc; - в описании класса надо объявить как
class function
Само собой, после этого она не должна/не может обращаться к данным конкретног экземпляра
Да, и вызвать ее можно будет вообще без создания экземпляра.
Пример из System
TObject = class
...
class function InitInstance(Instance: Pointer): TObject;
..
class function ClassName: ShortString;
class function ClassNameIs(const Name: string): Boolean;
class function ClassParent: TClass;
class function ClassInfo: Pointer;
class function InstanceSize: Longint;
class function InheritsFrom(AClass: TClass): Boolean;
class function MethodAddress(const Name: ShortString):
...
← →
oomneeq (2002-03-26 18:03) [5]Сори, почитал повнимательней и понял, что я несовсем в тему, но надеюсь с толку не сбил :-)
← →
Толик (2002-03-27 12:32) [6]Огромное всем спасибо.
class function - это не то (ведь в С"шном примере mem_fnc не была объявлена как static), а вот TMethod - это действительно то, что было нужно. Ещё раз спасибо...
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.04.08;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c