Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
[C++] Примерно так 09.11.04 14:50 Число просмотров: 1678
Автор: leo <Леонид Юрьев> Статус: Elderman
|
class A{
...
};
typedef void (A::*func_ptr_type)(int y);
func_ptr_type func_ptr;
(*func_ptr)(y); // вызов
|
<programming>
|
[C++] по поводу указателей на методы.. 09.11.04 14:23
Автор: zelych Статус: Member
|
можно ли в msvc как-нибудь поиметь указатель на метод объекта?
Примерно так:
class A { public: int func( int ); };
A a* = new A;
func_ptr = a->func;
x = func_ptr( y );
msvc говорит, что метод имеет тип int (__thiscall A::*)(int), при этом я __thiscall использовать не могу..
чего делать?
или без читерских методов типа ассемблера никак?
|
|
[C++] Примерно так 09.11.04 14:50
Автор: leo <Леонид Юрьев> Статус: Elderman
|
class A{
...
};
typedef void (A::*func_ptr_type)(int y);
func_ptr_type func_ptr;
(*func_ptr)(y); // вызов
|
| |
[C++] почти получилось (upd не получилось).. 09.11.04 15:18
Автор: zelych Статус: Member Отредактировано 09.11.04 15:38 Количество правок: 1
|
class A{
public: void func();
};
typedef void (A::*func_ptr_type)(void);
..
A *a = new A;
func_ptr_type func_ptr = A::func;
а вот здесь трабл:
> (*func_ptr)(y); // вызов
во-первых не компилится:
error C2171: '*' : illegal on operands of type 'func_ptr_type'
error C2064: term does not evaluate to a function taking 0 arguments
а во-вторых, по идее, должно выглядеть как-то так:
__asm {
mov ecx, dword ptr [a]
call [func_ptr]
}
попробую макрос написать..
[upd]
не пишется макрос:
#define call_ptr( p, o ) __asm mov ecx, dword ptr [o]; __asm call [p];
=>
call_ptr( ptr, a );
00413B52 mov ecx,dword ptr [a]
а куда 'call [p]' делся??
PS: Спасибо!
|
| | |
Re: а куда 'call [p]' делся?? 09.11.04 15:48
Автор: leo <Леонид Юрьев> Статус: Elderman
|
';' после __asm интерпретируется интерпретируется как начало комментария, для define нужно примерно так:
#define call_ptr( p, o ) {__asm {mov ecx, dword ptr [o]}; __asm {call [p];} }
|
| | |
Упс... (Re: term does not evaluate to a function...) 09.11.04 15:44
Автор: leo <Леонид Юрьев> Статус: Elderman Отредактировано 09.11.04 15:50 Количество правок: 1
|
> во-первых не компилится: > error C2171: '*' : illegal on operands of type > 'func_ptr_type' > error C2064: term does not evaluate to a function taking 0 > arguments
Забыл что еще нужен объект (экземпляр класса):
class some_class
{
public:
int some_field;
some_class()
{
some_field = 0;
}
int some_class_func(int dummy)
{
return some_field += dummy;
}
};
int main(int argc, char *argv[])
{
int (some_class::*class_func_ptr)(int) = some_class::some_class_func;
some_class some_object, *pointer_to_some_object = &some_object;
return (some_object.*class_func_ptr)(1)
+ (pointer_to_some_object->*class_func_ptr)(2);
}; ---
|
| | | |
с ассемблером как-то универсальнее.. можно указатели на разные классы делать.. 10.11.04 11:57
Автор: zelych Статус: Member
|
|
| | | | |
Мне кажется, для таких вещей лучше взглянуть на boost::function 10.11.04 18:55
Автор: Ktirf <Æ Rusakov> Статус: Elderman
|
Ну или в книжку Александреску "Современное проектирование на C++". Там эта задача подробно решена. Оно еще и работает не совсем медленно (2 уровня косвенности, кажется).
|
|
|