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

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

Восстановить пароль Регистрация
 
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
03.11.2013, 01:23     Указатель на функцию и функциональный класс #1
Есть такой код, но он не компилируется.
В коде я использую указатель на функцию "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 &);
использовать
C++
1
typedef int (*Func)(const int &, const int &);
Но как тогда сделать это в виде функционального класса?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.11.2013, 01:23     Указатель на функцию и функциональный класс
Посмотрите здесь:

Как передать параметр типа "указатель на указатель" в функцию? C++
Зачем передавать в функцию X указатель на callback функцию, если последняя ВНЕШНЯЯ и вызовется БЕЗО ВСЯКОГО УКАЗАТЕЛЯ? C++
Как преобразовать указатель на класс к указателю на асбтрактный класс? C++
Работа с файлом (передать указатель на файл в функцию, вернуть указатель на файл из функции) C++
функциональный класс C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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;
}
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
03.11.2013, 02:29  [ТС]     Указатель на функцию и функциональный класс #3
Vourhey, Спасибо, понял свою ошибку. Но я имел ввиду описать map функциональным классом вместо указателя. (как делегатом в C#). Я так понял что так нельзя, нужно использовать std::function.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
03.11.2013, 02:49     Указатель на функцию и функциональный класс #4
Цитата Сообщение от akk Посмотреть сообщение
описать map функциональным классом
Не понял этой фразы. Что за функциональный класс?
Цитата Сообщение от akk Посмотреть сообщение
вместо указателя
Вместо какого указателя? В примере не вижу его.
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 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 найти не может.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
03.11.2013, 03:14     Указатель на функцию и функциональный класс #6
Цитата Сообщение от akk Посмотреть сообщение
В комментариях было.
Это я видел. Функциональный класс описан на 7-ой строке.
Цитата Сообщение от akk Посмотреть сообщение
Указателя на функцию.
Его и нет в примере. Там объект.
Цитата Сообщение от akk Посмотреть сообщение
std::function<int(int, int)> - это вроде как в C# делегат.
Не в курсе шарповых извращений
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 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;
эквивалентны. Еще раз спасибо.
Vourhey
Почетный модератор
6469 / 2244 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
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 Посмотреть сообщение
эквивалентны.
Там, где у тебя указатель на функцию, попробуй передать объект.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 12:56     Указатель на функцию и функциональный класс
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
akk
 Аватар для akk
44 / 44 / 7
Регистрация: 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))
Yandex
Объявления
03.11.2013, 12:56     Указатель на функцию и функциональный класс
Ответ Создать тему
Опции темы

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