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

В чём смысл использования указателей на функции - C++

Восстановить пароль Регистрация
 
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
11.02.2014, 13:06     В чём смысл использования указателей на функции #1
Собсно,я не могу понять,в чём смысл использования указателей на функции,ведь можно вызывать функции напрямую.Или же это сделано чисто для компактности кода при частом их вызове?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.02.2014, 13:09     В чём смысл использования указателей на функции #2
Игорюня, не знаю как насчет компактности кода, но указатели на функции бывают очень полезными, например, это дает возможность передавать функцию в другую функцию как аргумент(такую конструкцию можно увидеть в std::sort().
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.02.2014, 13:30     В чём смысл использования указателей на функции #3
ну например есть такое понятие как callback, там без него никак
вот примерно такой код
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
typedef void (*Func_t1)(int);
 
void F1(int i)
{
    std::cout<<"F1: i = "<<i<<std::endl;
}
 
void F2(int i)
{
    std::cout<<"F2: i = "<<i<<std::endl;
}
 
void Handle(Func_t1 CallBack, int i)
{
    CallBack(i);
}
 
 
int main()
{
    Func_t1 f = &F1;
    Handle(f, 5);
    f = &F2;
    Handle(f, 10);
    system("pause");
    return 0;
}
Добавлено через 10 минут
или что то вроде такого, можно создавать набор ф-ци обработчиков и Выбирать используемый набор

пример не самый ровный но суть передает
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
typedef void (*Func_t1)(int);
 
enum HandlerType
{
    eH1 = 0,
    eH2,
    eHMax
};
 
void Empty(int i)
{
    std::cout<<"Empty"<<std::endl;
}
void F1(int i)
{
    std::cout<<"F1: i = "<<i<<std::endl;
}
 
void F2(int i)
{
    std::cout<<"F2: i = "<<i<<std::endl;
}
 
std::vector<Func_t1> GetHandlerSet(HandlerType h)
{
    std::vector<Func_t1> Handlers(eHMax, &Empty);
    static std::vector<std::vector<Func_t1> > HandlersStorage(eHMax, Handlers);
    HandlersStorage[eH1][eH1] = &F1;
    HandlersStorage[eH2][eH2] = &F2;
    return HandlersStorage[h];
}
 
int main()
{
    std::vector<Func_t1> Handlers = GetHandlerSet(eH1);
 
    Handlers[eH1](6);
    Handlers[eH2](7);
 
    Handlers = GetHandlerSet(eH2);
    
 
    Handlers[eH1](8);
    Handlers[eH2](9);
 
    system("pause");
    return 0;
}
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
11.02.2014, 13:32     В чём смысл использования указателей на функции #4
aLarman, де жа вю получилось, я пару минут назад почти такой же код набросал)
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
#include <iostream>
 
class Button
{
    public:
        typedef void (*Callback)();
        
        Button() : func(nullptr) {}
        
        void process() {
            func();
        }
        
        void setCallback(Callback c) {
            func = c;
        }
        
        private:
            Callback func;
};
 
int main()
{
    const int size = 4;
    Button b[size];
    
    b[0].setCallback([] () { std::cout << "func 1 called\n"; });
    b[1].setCallback([] () { std::cout << "func 2 called\n"; });
    b[2].setCallback([] () { std::cout << "func 3 called\n"; });
    b[3].setCallback([] () { std::cout << "func 4 called\n"; });
    
    std::cout << "Press 1, 2, 3, 4: ";
    
    while(1) {
        char key;
        std::cin >> key;
        b[key - '0'-1].process();
        std::cout << "\n";  
    }
    
    return 0;
}
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.02.2014, 13:37     В чём смысл использования указателей на функции #5
coloc, а это первое что в голову приходит
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
11.02.2014, 13:44  [ТС]     В чём смысл использования указателей на функции #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;
 
 
class random
{
public:
    void function () {cout<<"text"<<endl;}
 
};
 
int main()
{   void(random::*pointer)();
    pointer=&random::function;
    random object;
    (object.*pointer)();
    system("pause");
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
typedef  void(random::*PNT)();
 
class random
{
public:
    void function () {cout<<"text"<<endl;}
 
};
 
int main()
{   
    
    PNT pointer=&random::function;
    random object;
    (object.*pointer)();
    system("pause");
}
Не могу понять,почему компилятор ругается,когда заношу тип в typedef:

random: не является именем класса или пространства имен
: нет полного имени для указателя на член (имеется ":: *")
coloc
погромист
 Аватар для coloc
409 / 245 / 15
Регистрация: 27.08.2012
Сообщений: 550
Завершенные тесты: 1
11.02.2014, 13:45     В чём смысл использования указателей на функции #7
Игорюня,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstdlib>
using namespace std;
 
class random;
 
typedef  void(random::*PNT)();
 
class random
{
public:
    void function () {cout<<"text"<<endl;}
 
};
 
int main()
{   
    
    PNT pointer=&random::function;
    random object;
    (object.*pointer)();
    system("pause");
}
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
11.02.2014, 13:48  [ТС]     В чём смысл использования указателей на функции #8
Цитата Сообщение от coloc Посмотреть сообщение
Игорюня,
Просто нужно было переместить typedef ниже).Если typedef объявить перед классами и функциями,то он всех их перекроет?
mustimur
268 / 222 / 57
Регистрация: 22.11.2013
Сообщений: 832
Записей в блоге: 1
11.02.2014, 13:51     В чём смысл использования указателей на функции #9
Ну от себя могу добавить пример RKF45 - это функция решения систем ОДУ первого порядка (еще реализована на фортране потом многократно переводилась на др. языки), алгоритм универсальный и не привязан к конкретной системе, и может быть использован в одном коде для решения многих систем ОДУ. В качестве одного из аргументов эта функция принимает указатель на функцию с системой ОДУ которую и решает.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.02.2014, 15:05     В чём смысл использования указателей на функции
Еще ссылки по теме:

C++ В чём смысл return в main()?
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей C++
Объясните, пожалуйста, смысл функции C++

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

Или воспользуйтесь поиском по форуму:
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
11.02.2014, 15:05     В чём смысл использования указателей на функции #10
Цитата Сообщение от Игорюня Посмотреть сообщение
Если typedef объявить перед классами и функциями,то он всех их перекроет?
не совсем понятно что Вы имеет ввиду, но Ваш вариант с typedef не работал, потому что код просматривается сверху вниз, и при объявлении typedef-a класс random не был еще объявлен, решение
C++
1
2
class random;
typedef...
сообщаем что такой класс существует, просто будет описан позже
Yandex
Объявления
11.02.2014, 15:05     В чём смысл использования указателей на функции
Ответ Создать тему
Опции темы

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