информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
[C++] Примерно так 09.11.04 14:50  Число просмотров: 1719
Автор: 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 уровня косвенности, кажется).
1




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


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