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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[C++] как узнать адрес метода класса? 10.12.02 15:19  
Автор: CZ Статус: Незарегистрированный пользователь
<"чистая" ссылка>
дан класс

class abc{
int data1,data2;
....
void method();
....
}
в программе надо узнать, где находится адрес method.
&method ;-))) 10.12.02 15:51  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
Другое дело, что у этого метода соглашение о вызове thiscall. А это значит, что при вызове функции ВСЕГДА неявно передается указатель на объект, для которого она вызвана. А вызвать ее через полученный таким образом (&method) указатель будет весьма проблематично.
Если тебе надо для передачи в качестве колбяки в какую-нить API, то подумай над вариантом статической функции-члена:
class Class{
public:
static void memberfunc(void);
//...
};

void (*pfunc)(void) = &Class::memberfunc;

void
f() {
pfunc();
}

---
Если же ты точно знаешь для какого объекта будет вызвана функция, но не всегда знаешь какая, то нужно смотреть в направлении указателей на член (pointer to member):
class Class {
public:
void memberfunc(void);
//...
} a, b, *pa = &a, *pb = &pb;

void (Class::*pmemfunc)(void) = &Class::memberfunc();

void
f1() {
a.*pmemfunc();
b.*pmemfunc();
pa->*pmemfunc();
pb->*pmemfunc();
}

// Или даже так
void
f2(Class &ref, Class *ptr, void (Class::*pmf)(void)) {
ref.*pmf();
ptr->*pmf();
}

---
Вот только по моей глубокой имхе второй вариант из области извращений. Практически везде, где могут понадобиться указатели на функции-члены (не статические) можно обойтись наследованием и виртуальными функциями, и при этом код будет гораздо элегантнее и легче в сопровождении и расширении.
Сам я люблю C, но при этом не стоит смешивать парадигмы и писать на C++ просто как на C с классами.
[C++] &method :(( ststic 10.12.02 17:23  
Автор: CZ Статус: Незарегистрированный пользователь
<"чистая" ссылка>

> class Class {
> public:
> void memberfunc(void);
> //...
> } a, b, *pa = &a, *pb = &pb;
>
> void (Class::*pmemfunc)(void) = &Class::memberfunc();




на это компилятор (VC) ругаетя. все равно должен быть ststicoм. Где используется статик, сразу отбрасываем. Следовательно остальной код не заработал.(может только у меня)

>
> void
> f1() {
> a.*pmemfunc();
> b.*pmemfunc();
> pa->*pmemfunc();
> pb->*pmemfunc();
> }
> // Или даже так
> void
> f2(Class &ref, Class *ptr, void (Class::*pmf)(void)) {
> ref.*pmf();
> ptr->*pmf();
> }


Несколько серьезных протупов - fixed %-) 10.12.02 19:13  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
class Class {
public:
	void memberfunc(void);
} a, b, *pa, *pb;

void (Class::*pmemfunc)(void) = &Class::memberfunc;

void
f1() {
	(a.*pmemfunc)();
	(b.*pmemfunc)();
	(pa->*pmemfunc)();
	(pb->*pmemfunc)();
}

void
f2(Class &ref, Class *ptr, void (Class::*pmf)(void)) {
	(ref.*pmf)();
	(ptr->*pmf)();
}

---

Протупы можно наити и так, простым сравнением. На этот раз все проверено электроникой :-))
1




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


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