Форум программистов, компьютерный форум CyberForum.ru

Указатель на функцию-член - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
13.11.2012, 03:20     Указатель на функцию-член #1
Доброго времени суток, возникла следующая ситуация:
Приведу пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A {
public:
    void a() { cout << "hello!"; };
};
 
class B {
public:
    void b(void (*pfunc)()) { pfunc(); };
};
 
 
int main(){
    A* a = new A;
    B* b = new B;
 
    b->b(a->a()); // ????????????
    
return 0;
}
при такой передаче параметра в функцию естественно произойдет ошибка:
C++
1
error C2664: 'B::b' : cannot convert parameter 1 from 'void' to 'void (__cdecl *)(void)'
Кто подскажет, как правильно и лучше передать указатель на функцию-член класса?
Функции не статические.

Добавлено через 8 минут
на данный момент у меня только такие решения есть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
A* a = new A;
B* b = new B;
 
void func(){
    a->a();
}
 
int main(){
    b->b(func); // ????????????
    
return 0;
}
или объявление функции a() как статическая
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
13.11.2012, 03:59     Указатель на функцию-член #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
 
class A {
    
public:
    void func() { 
    
        std::cout << "hello!" << std::endl;
    }
};
 
class B {
    
public:
    void func(void (A::*pfunc)(), A& obj) {  
    
        (obj.*pfunc)();
    }
};
 
 
int main() {
    
    A* a_obj = new A;
    B* b_obj = new B;
 
    b_obj->func(&A::func, *a_obj);
    
    delete a_obj;
    delete b_obj;
}
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,602
Записей в блоге: 17
13.11.2012, 04:20     Указатель на функцию-член #3
Почему не передавать указатель на сам класс ?

C++
1
void B::b(A* a) {  a->a()  };
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
13.11.2012, 04:52  [ТС]     Указатель на функцию-член #4
Проще говоря, есть класс B в котором реализован метод принимающий параметр как указатель на функцию. Какая функция и с какого класса эта функция будет - неизвестно. Проще говоря есть такие данные:
C++
1
2
3
4
5
6
class B {
public:
    void b(void (*pfunc)()){ 
        pfunc();
    };
};
и есть какой-то класс (как называется неизвестно), в котором есть метод X или Y, или Z - в общем заранее не известно как этот метод будет называться. Все, что мне нужно сделать, это в метод b() класса B передать некий метод с другого класса.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.11.2012, 04:54     Указатель на функцию-член #5
Так передавай указатель на сам класс!
Не бойся сделать лишнюю обёртку в виде абстрактного класса с единственным методом.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,602
Записей в блоге: 17
13.11.2012, 05:04     Указатель на функцию-член #6
Поясню указатель на метод и указатель на ф-цию - разные вещи...
Указатель на метод - это смещение члена относительно класса.

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Так передавай указатель на сам класс!
Не бойся сделать лишнюю обёртку в виде абстрактного класса с единственным методом.
И от него наследовать класс A и другие в дальнейшем
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.11.2012, 05:17     Указатель на функцию-член #7
Цитата Сообщение от Avazart Посмотреть сообщение
И от него наследовать класс A ... Z
А почему бы и нет? В той же джаве дофига мелких классов бывает объявляется.
Но главное, если ему потребовался указатель на функцию-член и таких функций действительно от A() до Z(), неужели ты думаешь, что создавать эти 26 функций намного легче, чем 26 классов-наследников?

Добавлено через 6 минут

Не по теме:

Цитата Сообщение от Avazart Посмотреть сообщение
Поясню указатель на метод и указатель на ф-цию - разные вещи...
Указатель на метод - это смещение члена относительно класса.
Эй, тут другое было

Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,602
Записей в блоге: 17
13.11.2012, 05:17     Указатель на функцию-член #8
Цитата Сообщение от ps10n1ck Посмотреть сообщение
и есть какой-то класс (как называется неизвестно), в котором есть метод X или Y, или Z - в общем заранее не известно как этот метод будет называться. Все, что мне нужно сделать, это в метод b() класса B передать некий метод с другого класса.
Наверное невнимательно читаю ...

Перечитав понял следующие - не тип класса ни само имя метода неизвестно заранее так ?

Если б имя метода было одно и тоже то достаточно было зашаблонить
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//---------------------------------------------------------------------------
class A
{
public:
        void a() { std::cout << "hello! A\n"; };
};
//---------------------------------------------------------------------------
class C
{
public:
        void a() { std::cout << "hello C!\n"; };
};
//---------------------------------------------------------------------------
class B
{
public:
        template<class T> void b(T* t)
        {
            t->a();
        };
};
//---------------------------------------------------------------------------
int main()
{
        A* a = new A;
        B* b = new B;
        C* c = new C;
 
        b->b(a);
        b->b(c);
 
        delete a,b,c;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
13.11.2012, 05:24  [ТС]     Указатель на функцию-член #9
Цитата Сообщение от Avazart Посмотреть сообщение
Наверное невнимательно читаю ...

Перечитав понял следующие - не тип класса ни само имя метода неизвестно заранее так ?

Если б имя метода было одно и тоже то достаточно было зашаблонить
Да, не тип класса не имя метода неизвестно, в том то и вся беда. Если бы имена были одинаковыми, то можно было бы через шаблон как Вы и писали.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,602
Записей в блоге: 17
13.11.2012, 05:27     Указатель на функцию-член #10
Т.е. нужно что-то вроде адаптера, прослойки между классами A1...AX и B

Ну а хоть тип(сигнатура) самого метода один и тот же ?
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
13.11.2012, 05:31  [ТС]     Указатель на функцию-член #11
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е. нужно что-то вроде адаптера, прослойки между классами A1...AX и B

Ну а хоть тип(сигнатура) самого метода один и тот же ?
Да сигнатура у них одинаковая, только имена методов неизвестны.
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,602
Записей в блоге: 17
13.11.2012, 05:32     Указатель на функцию-член #12
Мм а что если совместить пример rangerx и шаблоны ?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
13.11.2012, 05:33     Указатель на функцию-член #13
Цитата Сообщение от ps10n1ck Посмотреть сообщение
Да, не тип класса не имя метода неизвестно, в том то и вся беда. Если бы имена были одинаковыми, то можно было бы через шаблон как Вы и писали.
А что это за такая задача, что требуется передать то, незнаю что? Можно о задаче подробнее?

Почему наследование не желаешь применять?
Сколько всего этих различных методов, на которые будешь брать указатели?
Я настоятельно рекомендую наследование.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class aMethodHolder{
public:
virtual void a() =0;
};
 
class A: public aMethodHolder
{
public:
        void a() { std::cout << "hello! A\n"; };
};
//---------------------------------------------------------------------------
class C: public aMethodHolder
{
public:
        void a() { std::cout << "hello C!\n"; };
};
class B
{
public:
        void b(aMethodHolder* t)
        {
            t->a();
        };
};
Но мне действительно непонятно, что не устраивает???
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,602
Записей в блоге: 17
13.11.2012, 05:38     Указатель на функцию-член #14
Вот так вот как-то:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//---------------------------------------------------------------------------
class A1
{
public:
        void func1()
            {
                std::cout << "hello #1!" << std::endl;
            }
};
//---------------------------------------------------------------------------
class A2 {
 
public:
        void func21()
            {
                std::cout << "hello #2.1!" << std::endl;
            }
        void func22()
            {
                std::cout << "hello #2.2!" << std::endl;
            }
};
//---------------------------------------------------------------------------
class B
{
public:
        template<class T> void func(void (T::*pfunc)(), T& obj)
            {
                (obj.*pfunc)();
            }
};
//---------------------------------------------------------------------------
int main()
{
        A1* a1_obj = new A1;
        A2* a2_obj = new A2;
 
        B* b_obj = new B;
 
        b_obj->func(&A1::func1, *a1_obj);
        b_obj->func(&A2::func21, *a2_obj);
        b_obj->func(&A2::func22, *a2_obj);
 
        delete a1_obj, a2_obj, b_obj;
 
system("pause");
return 0;
}
//---------------------------------------------------------------------------
ps10n1ck
 Аватар для ps10n1ck
53 / 47 / 2
Регистрация: 10.11.2010
Сообщений: 132
13.11.2012, 05:47  [ТС]     Указатель на функцию-член #15
Цитата Сообщение от Avazart Посмотреть сообщение
Вот так вот как-то:
Это то, что нужно. Спасибо!
rangerx
13.11.2012, 16:06
  #16

Не по теме:

Avazart, оператор delete может принимать только один аргумент. Т.е. в
delete a1_obj, a2_obj, b_obj;
все, что находится после выделенного фрагмента не относится к delete.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2012, 19:51     Указатель на функцию-член
Еще ссылки по теме:

Указатель на функцию-член C++
Как создать указатель на функцию-член класса и вызвать его? C++
Указатель на функцию-член класса C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Avazart
 Аватар для Avazart
6901 / 5141 / 252
Регистрация: 10.12.2010
Сообщений: 22,602
Записей в блоге: 17
13.11.2012, 19:51     Указатель на функцию-член #17
rangerx, Точно...
Yandex
Объявления
13.11.2012, 19:51     Указатель на функцию-член
Ответ Создать тему
Опции темы

Текущее время: 20:22. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru