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

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

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

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

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

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

Особенности использования указателей и ссылок в C++ при возврате из функции - C++
Пусть у нас есть некий класс CBase и есть функция, которая создает и возвращает объект класса CBase. Создать она его может стеке или в...

Dynamic_cast и static_cast: в чём смысл? - C++
Здравствуйте! Подскажите пожалуйста... В теории, как я понял, dynamic_cast является лишь приравниванием ссылки на 1 класс(допустим,...

В чём смысл return в main()? - C++
Есть ли смысл возвращать значение переменной в main()? Если да - зачем? #include<iostream> using namespace std; int main() ...

В чем смысл указателей? - C++
Дорогие друзья, не могу понять смысл указателей в С++? Для чего они нужны? Если не трудно на реальном примере объясните ,пожалуйста.

Как работает и в чём смысл побитового И в заданном фрагменте кода? - C++
Как то раз в просторах сети нашёл вот такую запись. fun ((x + y) & 1); Где в fun равняется первый элемент void fun (const int) ...

Смысл использования полиморфизма - C++
#include <iostream> using namespace std; class A{ public: virtual void speak() {} };

Я новичок создаю программу подскажите в чём смысл ошибок???? что-то с библиотекой glut ? - C++
Создаю программу моделирование гравитации ) выдавало ошибку что нет библиотеки glut ) нашёл в инете скопировал вставил после этого выдаёт...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
metaluga145
243 / 244 / 20
Регистрация: 08.04.2013
Сообщений: 927
11.02.2014, 13:09     В чём смысл использования указателей на функции #2
Игорюня, не знаю как насчет компактности кода, но указатели на функции бывают очень полезными, например, это дает возможность передавать функцию в другую функцию как аргумент(такую конструкцию можно увидеть в std::sort().
aLarman
642 / 563 / 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
погромист
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
642 / 563 / 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
погромист
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++
Всем привет. Есть программа с указателями , как сделать её без указателей? #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; ...

Записать функцию без использования указателей - C++
опять же всем доброго времени суток. знаю, что задание немного странное, но таково оно и есть. надо записать функцию без использования...

Привести примеры использования и объяснить, в чём суть оператора ^= - C++
Объясните пожалуйста, в чём суть оператора присваивания ^= в C++. Если можно, с примерами.

Нюансы синтаксиса и тонкости использования указателей и массивов - C++
Доброго времени суток! Никак не могу понять, почему один вариант кода работает: #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...

Объяснить нюансы использования указателей, массивов и ссылок в функциях - C++
Здравствуйте. Скажите, а что выводит arry значения элемента массива или его адрес? А как понимать что функция возвращает ссылку на int?...


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

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

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