Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
|
&method ;-))) 10.12.02 15:51 Число просмотров: 1174
Автор: 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 с классами.
|
<programming>
|
[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)();
}
---
Протупы можно наити и так, простым сравнением. На этот раз все проверено электроникой :-))
|
|
|