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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Игорюня
 Аватар для Игорюня
20 / 16 / 7
Регистрация: 07.12.2013
Сообщений: 244
#1

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

11.02.2014, 13:06. Просмотров 453. Ответов 9
Метки нет (Все метки)

Собсно,я не могу понять,в чём смысл использования указателей на функции,ведь можно вызывать функции напрямую.Или же это сделано чисто для компактности кода при частом их вызове?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.02.2014, 13:06     В чём смысл использования указателей на функции
Посмотрите здесь:

Я новичок создаю программу подскажите в чём смысл ошибок???? что-то с библиотекой glut ? C++
В чем смысл указателей? C++
C++ Записать функцию без использования указателей
Особенности использования указателей и ссылок в C++ при возврате из функции C++
Dynamic_cast и static_cast: в чём смысл? C++
C++ В чём смысл return в main()?
C++ Нюансы синтаксиса и тонкости использования указателей и массивов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.02.2014, 13:09     В чём смысл использования указателей на функции #2
Игорюня, не знаю как насчет компактности кода, но указатели на функции бывают очень полезными, например, это дает возможность передавать функцию в другую функцию как аргумент(такую конструкцию можно увидеть в std::sort().
aLarman
640 / 561 / 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
640 / 561 / 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++ Как работает и в чём смысл побитового И в заданном фрагменте кода?
C++ Переписать программу без использования указателей
Смысл использования полиморфизма C++
C++ Объяснить нюансы использования указателей, массивов и ссылок в функциях
C++ Привести примеры использования и объяснить, в чём суть оператора ^=

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

Или воспользуйтесь поиском по форуму:
aLarman
640 / 561 / 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     В чём смысл использования указателей на функции
Ответ Создать тему
Опции темы

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