как получить указатель на метод??
От: matros Украина http://www.palmorder.com
Дата: 18.08.03 15:01
Оценка:
Если не трудно, работающий пример как получить указатель на метод и передать его в функцию.
Спасибо.
Re: как получить указатель на метод??
От: vdimas Россия  
Дата: 18.08.03 15:12
Оценка:
Здравствуйте, matros, Вы писали:

M>Если не трудно, работающий пример как получить указатель на метод и передать его в функцию.

M>Спасибо.


class s1 {
public:
    int CALLBACK f1(int i);
};

class Delegate
{
    s1* obj;
    int (CALLBACK s1::*fn);  
public:
    Delegate(s1* obj_, int(CALLBACK s1::*fn_)) : obj(obj_), fn(fn_) {}
    int operator(int i) { return (obj->::*fn)(i); }
};

где-то в коде:
...
s1 s;
Delegate d(&s, s1::f1);
int k=d(10);
...
Re: как получить указатель на метод??
От: Кодт Россия  
Дата: 18.08.03 15:14
Оценка:
Здравствуйте, matros, Вы писали:

M>Если не трудно, работающий пример как получить указатель на метод и передать его в функцию.


class MyClass
{
public:
    static void hello(const char* world);
    void goodbye(const char* people);
};

void say_hello( void(*pfn)(const char*) )
{
    (*pfn)("earth");
}

void say_goodbye( MyClass* ptr, void(MyClass::*pfn)(const char*) )
{
    (ptr->*pfn)("guys");
}

main()
{
    say_hello(MyClass::hello);
    
    MyClass obj;
    say_goodbye(&obj, obj.goodbye);
}
... << RSDN@Home 1.1 beta 1 >>
Перекуём баги на фичи!
Re[2]: как получить указатель на метод??
От: Павел Кузнецов  
Дата: 19.08.03 09:21
Оценка:
Здравствуйте, vdimas, Вы писали:

v>
v> Delegate d(&s, &s1::f1);
v>


Опускать "&" нельзя.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: как получить указатель на метод??
От: Павел Кузнецов  
Дата: 19.08.03 09:21
Оценка:
Здравствуйте, Кодт, Вы писали:

К>
К>  say_hello(&MyClass::hello);
К>


Опускать "&" нельзя.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[2]: как получить указатель на метод??
От: matros Украина http://www.palmorder.com
Дата: 19.08.03 13:54
Оценка:
 void hello(const char *ch)
{
  cout<<"hello from:"<< ch <<endl;
}
void from(void (*fn)(const char ch*))
{
  (*fn)("me");
}

main()
{
 from(&hello);
}


Работает замечательно
а:
class MyClass
{
public:
 void hello(const char *ch);
};
void MyClass::hello(const char *ch)
{
 cout<<"hello from :"<< ch << endl;
}
void say_h(void (*fn)(const char *))
{
 (*fn)("me");
}

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
 say_h(&MyClass::hello);
}

говорит такое:

cannot convert parameter 1 from 'void (__thiscall MyClass::*)(const char *)' to 'void (__cdecl *)(const char *)'
Re[3]: как получить указатель на метод??
От: Lorenzo_LAMAS  
Дата: 19.08.03 13:56
Оценка:
Потому как это разные типы указателей: один (формальный параметр) — это указатель на функцию, второй(фактический аргумент) — это указатель на член-функцию (это тоже прокатило бы, если б твоя функция-член была статической, но так как она у тебя non-static, то не прокатывает)
Of course, the code must be complete enough to compile and link.
Re[4]: как получить указатель на метод??
От: matros Украина http://www.palmorder.com
Дата: 19.08.03 14:02
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>Потому как это разные типы указателей: один (формальный параметр) — это указатель на функцию, второй(фактический аргумент) — это указатель на член-функцию (это тоже прокатило бы, если б твоя функция-член была статической, но так как она у тебя non-static, то не прокатывает)


Да, действительно. а как можно это сделать?

и еще одно:

если функция hello() перегружается то как вызвать ту, которую надо??
Re[5]: как получить указатель на метод??
От: matros Украина http://www.palmorder.com
Дата: 19.08.03 14:04
Оценка:
Здравствуйте, matros, Вы писали:

M>Здравствуйте, Lorenzo_LAMAS, Вы писали:


L_L>>Потому как это разные типы указателей: один (формальный параметр) — это указатель на функцию, второй(фактический аргумент) — это указатель на член-функцию (это тоже прокатило бы, если б твоя функция-член была статической, но так как она у тебя non-static, то не прокатывает)


M>Да, действительно. а как можно это сделать?


M>и еще одно:


M>если функция hello() перегружается то как вызвать ту, которую надо??

т.е. как пределать ф-ю

void say_h(void (*fn)(const char*))
{
(*fn)("me");
}
Re[5]: как получить указатель на метод??
От: Lorenzo_LAMAS  
Дата: 19.08.03 14:05
Оценка:
M>Да, действительно. а как можно это сделать?


class A
{
public:
    static void fun(const char *);
};

void g(void(const char *));

void f()
{
     g(&A::fun);
}



M>и еще одно:


M>если функция hello() перегружается то как вызвать ту, которую надо??

Правильная функция будет выбрана по типу указателя
Of course, the code must be complete enough to compile and link.
Re[6]: как получить указатель на метод??
От: Анатолий Широков СССР  
Дата: 19.08.03 14:08
Оценка:
<--void g(void(const char *));
-->void g(void(*)(const char *));
Re[7]: как получить указатель на метод??
От: Lorenzo_LAMAS  
Дата: 19.08.03 14:09
Оценка:
написанному — верить.

если серьезно, то написанное мною тоже верно.
Of course, the code must be complete enough to compile and link.
Re[6]: как получить указатель на метод??
От: matros Украина http://www.palmorder.com
Дата: 19.08.03 14:13
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

M>>Да, действительно. а как можно это сделать?


L_L>

L_L>class A
L_L>{
L_L>public:
L_L>    static void fun(const char *);
L_L>};

L_L>void g(void(const char *));

L_L>void f()
L_L>{
L_L>     g(&A::fun);
L_L>}
L_L>

Это я понял, я имел ввиду без static. никак?

M>>и еще одно:


M>>если функция hello() перегружается то как вызвать ту, которую надо??

L_L>Правильная функция будет выбрана по типу указателя

какого указателя??

void hello(const char*);
void hello(const int);
void say(void (fn*)( ????? _parameter)) <<<????
{
(fn*)(_parameter);
}

main()
{
say(&hello);
}
Re[8]: как получить указатель на метод??
От: Анатолий Широков СССР  
Дата: 19.08.03 14:13
Оценка:
Здравствуйте, Lorenzo_LAMAS, Вы писали:

L_L>написанному — верить.


L_L>если серьезно, то написанное мною тоже верно.


Да, только подобная штука с class member-ами не пройдет.

А что на счет http://www.rsdn.ru/Forum/Message.aspx?mid=357511&amp;only=1
Автор: Анатолий Широков
Дата: 19.08.03
?
Re[7]: как получить указатель на метод??
От: Lorenzo_LAMAS  
Дата: 19.08.03 14:16
Оценка:
Без static тебе помимо указателя на функцию понадобится еще и объект, чтоб было для кого ее вызвать

class A
{
public:
   void fun(const char *);
};

void g(void (A::*pf)(const char *))
{
    A a;
    (a.*pf)("lorenzo");
}
Of course, the code must be complete enough to compile and link.
Re[9]: как получить указатель на метод??
От: Lorenzo_LAMAS  
Дата: 19.08.03 14:17
Оценка:
АШ>Да, только подобная штука с class member-ами не пройдет.
Да уж.
Of course, the code must be complete enough to compile and link.
Re[2]: как получить указатель на метод??
От: Павел Кузнецов  
Дата: 19.08.03 14:17
Оценка: 1 (1)
Здравствуйте, Кодт, Вы писали:

К>
К> void say_goodbye( MyClass* ptr, void(MyClass::*pfn)(const char*) )
К> . . .
К> say_goodbye(&obj, obj.goodbye);
К>


И выражение obj.goodbye взятием адреса функции MyClass::goodbye тоже не является.
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: как получить указатель на метод??
От: Кодт Россия  
Дата: 19.08.03 14:24
Оценка:
Здравствуйте, matros, Вы писали:

M>
M>class MyClass
M>{
M>public:
M> void hello(const char *ch);
M>};
M>void MyClass::hello(const char *ch)
M>{
M> cout<<"hello from :"<< ch << endl;
M>}
M>void say_h(void (*fn)(const char *))
M>{
M> (*fn)("me");
M>}

M>int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
M>{
M> say_h(&MyClass::hello);
M>}
M>

M>говорит такое:
M>cannot convert parameter 1 from 'void (__thiscall MyClass::*)(const char *)' to 'void (__cdecl *)(const char *)'
M>

Потому что
а) нужно внимательно читать текст программы, которую я привел
б) немного думать.

Вот ты вызываешь функцию по указателю:
(*fn)("me");

а ведь это — метод объекта(*) класса MyClass. Где здесь объект?
-------
*) метод объекта — выполняется в связке с объектом. obj.hello("me"); pObj->hello("me");
В отличии от статического метода — который выполняется без связки. MyClass::hello2("me");

Но, скажешь ты, ведь функция say_h(void(*)(const char*)) скомпилировалась, а ошибка ниже?
Разумеется.
Компилятор понимает, что в main() ты метод объекта пытаешься передать (и в дальнейшем использовать) как обычную функцию. Вот и дает тебе по пальцам.

Упрощая ситуацию, можно сказать: в метод объекта неявно передается указатель на объект. Т.е. тип твоего метода hello() будет примерно такой: void(*)(MyClass*, const char*).
Согласись, это не то же самое, что void(*)(const char*).
... << RSDN@Home 1.1 beta 1 >>
Перекуём баги на фичи!
Re[4]: как получить указатель на метод??
От: matros Украина http://www.palmorder.com
Дата: 19.08.03 19:47
Оценка:
спасибо.понял
Re[4]: как получить указатель на метод??
От: matros Украина http://www.palmorder.com
Дата: 19.08.03 20:03
Оценка:
подожди, подожди.

Это ты недосмотрел.
Посмотри свой текст, может и ты ошибся? нет. просто static ее нужно было сделать, как я понимаю, именно для возможности вызова без создания объекта, да?
я так думаю.

но есть еще вопрос:
а что если ф-я hello() перезагружена??

class MyClass
{
public:
 static void hello(const char *ch);
 static void hello(const int);
};
void MyClass::hello(const char *ch)
{
 cout<<"hello from :"<< ch << endl;
}

void MyClass::hello(const int var)
{
 cout<<"variable : "<< var << endl;
}


как написать ф-ю
void say_h(???????)
{
 (*fn)("me");
}

int main()
{
 say_h(&MyClass::hello);
}


?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.