Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
akk
44 / 44 / 17
Регистрация: 28.01.2012
Сообщений: 341
#1

Указатель на функцию и функциональный класс - C++

03.11.2013, 01:23. Просмотров 546. Ответов 8
Метки нет (Все метки)

Есть такой код, но он не компилируется.
В коде я использую указатель на функцию "Func", что я делаю неправильно? и как это можно записать в виде функционального класса (в комментариях начал его писать, но как его корректно вызвать не могу придумать).

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
#include <iostream>
#include <memory>
#include <map>
#include <string>
 
using namespace std;
 
int add(const int &a, const int &b)
{
    return a+b;
}
 
int (*Func)(const int &, const int &);
 
/*
class Func
{
    int operator()(const int &, const int &);
};
*/
int main(int argc, char * argv[])
{
    map<string, Func> * qwe = new map<string, Func>();
    
    qwe->insert(pair<string, Func>("+", add);
    cout<<(*qwe)["+"](5,7);
    
    delete qwe;
    
    cin.get();
    return 0;
}
Добавлено через 29 минут
С указателем на функцию понял в чем была моя ошибка нужно вместо
C++
1
int (*Func)(const int &, const int &);
использовать
http://www.cyberforum.ru/cpp-beginners/thread1411830.html
C++
1
typedef int (*Func)(const int &, const int &);
Но как тогда сделать это в виде функционального класса?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 01:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Указатель на функцию и функциональный класс (C++):

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void...

Включите в класс Met функцию bool moved(), которая получает результат вызова pointer() и сообщает, был ли перемещен указатель
Включите в класс Met функцию bool moved(), которая получает результат вызова...

функциональный класс
Не могли бы вы привести пример функционального класса, для сортировки...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall...

8
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
03.11.2013, 02:22 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <map>
#include <functional>
 
using namespace std;
 
struct A
{
    int operator()(int a, int b){ return a+b;}
};
 
int main()
{
    std::map<std::string, std::function<int(int, int)>> funcs;
    funcs["one"] = A();
    std::cout<<funcs["one"](4, 5)<<std::endl;
    return 0;
}
1
akk
44 / 44 / 17
Регистрация: 28.01.2012
Сообщений: 341
03.11.2013, 02:29  [ТС] #3
Vourhey, Спасибо, понял свою ошибку. Но я имел ввиду описать map функциональным классом вместо указателя. (как делегатом в C#). Я так понял что так нельзя, нужно использовать std::function.
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
03.11.2013, 02:49 #4
Цитата Сообщение от akk Посмотреть сообщение
описать map функциональным классом
Не понял этой фразы. Что за функциональный класс?
Цитата Сообщение от akk Посмотреть сообщение
вместо указателя
Вместо какого указателя? В примере не вижу его.
0
akk
44 / 44 / 17
Регистрация: 28.01.2012
Сообщений: 341
03.11.2013, 03:10  [ТС] #5
Цитата Сообщение от Vourhey Посмотреть сообщение
Что за функциональный класс?
В комментариях было.
Цитата Сообщение от akk Посмотреть сообщение
C++
1
class Func { int operator()(const int &, const int &); };
Цитата Сообщение от Vourhey Посмотреть сообщение
Вместо какого указателя?
Указателя на функцию.
Цитата Сообщение от akk Посмотреть сообщение
C++
1
typedef int (*Func)(const int &, const int &);
Хотел функциональным классом описать шаблон map, но это уже есть сама функция и так делать нельзя.
std::function<int(int, int)> - это вроде как в C# делегат.

Добавлено через 6 минут
В gcc 4.7.2 что-то functional найти не может.
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
03.11.2013, 03:14 #6
Цитата Сообщение от akk Посмотреть сообщение
В комментариях было.
Это я видел. Функциональный класс описан на 7-ой строке.
Цитата Сообщение от akk Посмотреть сообщение
Указателя на функцию.
Его и нет в примере. Там объект.
Цитата Сообщение от akk Посмотреть сообщение
std::function<int(int, int)> - это вроде как в C# делегат.
Не в курсе шарповых извращений
0
akk
44 / 44 / 17
Регистрация: 28.01.2012
Сообщений: 341
03.11.2013, 03:28  [ТС] #7
Цитата Сообщение от Vourhey Посмотреть сообщение
Его и нет в примере. Там объект.
Да, это и была мая первая ошибка, я ее потом исправил.

Сейчас погуглив std::function, наткнулся на эту статью
Моя идея идея была реализовать с функциональным классом что-то подобное, но оказывается это сложновато пока для меня)

Добавлено через 5 минут
Теперь все у меня сходится std::function - это альтернатива указателям на функцию, т е записи
C++
1
2
map<string, int (*)(const int &, const int &)>  q;
map<string, function<int(const int &,const int &)> > q;
эквивалентны. Еще раз спасибо.
0
Vourhey
Почетный модератор
6490 / 2264 / 187
Регистрация: 29.07.2006
Сообщений: 12,534
03.11.2013, 03:39 #8
Цитата Сообщение от akk Посмотреть сообщение
Моя идея идея была реализовать с функциональным классом что-то подобное
Подобное чему? std::function? Что в итоге от этого изменится в результирующем коде?
Можно и так сделать, например:
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
class Func
{
public:
    virtual int operator()(int, int){return 0;};
};
 
class A: public Func
{
public:
    virtual int operator()(int a, int b) {return a+b;}
};
 
class B: public Func
{
public:
    virtual int operator()(int a, int b) {return a-b;}
};
 
int main()
{
    std::map<std::string, Func*> funcs;
    funcs["one"] = new A();
    funcs["two"] = new B();
    std::cout<<(*funcs["one"])(4, 5)<<std::endl;
    std::cout<<(*funcs["two"])(4, 5)<<std::endl;
Ну, да ладно, фиг с этой задачей, я слишком плохо понимаю твои цели, мысли и мотивы.

Добавлено через 2 минуты
Цитата Сообщение от akk Посмотреть сообщение
std::function - это альтернатива указателям на функцию
Нет.
Цитата Сообщение от akk Посмотреть сообщение
эквивалентны.
Там, где у тебя указатель на функцию, попробуй передать объект.
1
akk
44 / 44 / 17
Регистрация: 28.01.2012
Сообщений: 341
03.11.2013, 12:56  [ТС] #9
Цитата Сообщение от Vourhey Посмотреть сообщение
Подобное чему? std::function?
Когда я изначально писал первый пост, я еще не знал про std::function. Я хотел с помощью функционального класса описать map т е этот класс использовать в описании map
Цитата Сообщение от Vourhey Посмотреть сообщение
C++
1
class Func { public: virtual int operator()(int, int){return 0;}; };
а в сам map вставлять любые функции (точнее те которые подходят по сигнатуре int f(int, int))
0
03.11.2013, 12:56
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 12:56
Привет! Вот еще темы с решениями:

Передать в неуправляемую функцию указатель на указатель
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr)...

Указатель на указатель, класс группа
помогите пожалуйста не могу понять что со строкой 312 знаю что с...

Как преобразовать указатель на класс к указателю на асбтрактный класс?
Но тут есть одна тонкость- два промежуточных класса. Вот код, надеюсь всё из...

Указатель на функцию возвращающую указатель
Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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