информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsСетевые кракеры и правда о деле ЛевинаПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
с ассемблером как-то универсальнее.. можно указатели на разные классы делать.. 10.11.04 11:57  Число просмотров: 1553
Автор: zelych Статус: Member
<"чистая" ссылка>
<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 уровня косвенности, кажется).
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach