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

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

Войти
Регистрация
Восстановить пароль
 
Partum Somnia
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 3
#1

Передача функции из одного класса в функцию другого - C++

03.07.2015, 04:58. Просмотров 568. Ответов 8
Метки нет (Все метки)

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

Имется класс, в котором определена функция:
C++
1
2
3
4
5
6
7
class Task{
private: int a;
public:
double Func(double x){
   retrun a*x;
}
}
В другом классе определена функция выполняющая интегрирование:
C++
1
2
3
4
5
class Integ{
private: int a,b;
public:
double Integral(db Function(db x), db x1, db x2, int steps){ ... }// Передаётся функция, границы инт-ния, кол-во точек.
}
Тоесть, функция double Integral() принимает в качестве параметра функцию, которую нужно проинтегрировать.

Мне нужно в классе class Integ{} получить значение функции double Integral(db Function(db x), db x1, db x2, int steps) от функции double Func(double x).
Поптыка передать фукцнию напрямую:
C++
1
2
3
4
5
6
7
class Integ{
private: int a,b;
public:
Integral(db Function(db x), db x1, db x2, int steps){ ... }
 
void Result(){cout<<Integral(Task::Func, 0, 5, 100)} // Цифры вставил просто для примера. 
}
даёт ошибку при сборке: Integral(<unresolved overloaded function type>, double&, double&, int&). Как бы я не пыталяся, мне не удаётся передать функцию из одного класса в другой, как параметр для функции.
Не подскажите наиболее простой способ это сделать (С++98), чтобы передача осуществлялась без main(). (Классы в одтельных .cpp файлах написаны.)
Заранее примного благодарен.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 04:58     Передача функции из одного класса в функцию другого
Посмотрите здесь:
C++ Передача данных объекта одного класса , объекту другого
C++ Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса?
Передача функции (как параметра) в функцию унаследоваемого класса C++
C++ Как переместить из стека одного класса в массив другого класса?
Объявление объекта одного класса в описании другого класса C++
Передача свойства одного экземпляра класса другому экземпляру класса C++
C++ Доступ одного класса к данным другого
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6282 / 5885 / 1906
Регистрация: 18.12.2011
Сообщений: 15,096
Завершенные тесты: 1
03.07.2015, 06:16     Передача функции из одного класса в функцию другого #2
C++
1
2
3
4
5
6
7
8
9
10
class Integ{
private: int a,b;
public:
Integral(db Function(db x), db x1, db x2, int steps){ ... }
 
void Result()
{
    Task tt;
      cout<<Integral(tt.Func, 0, 5, 100); // Цифры вставил просто для примера. 
}
ReDoX
0 / 0 / 0
Регистрация: 01.07.2015
Сообщений: 10
03.07.2015, 06:33     Передача функции из одного класса в функцию другого #3
Не знаю, правильно ли будет работать, но по идее можно еще так:

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
class Task {
public:
    double Func(double x)
    {
        return a * x;
    }
 
private:
    int a;
};
 
class Integ {
public:
    double Integral(double(Task::*Func)(double), double x1, double x2, int steps)
    {
        return 0.0;
    }
 
    void result()
    {
        Integral(&Task::Func, 1.0, 1.0, 100);
    }
 
private:
    int a;
    int b;
};
Max Dark
шКодер самоучка
1783 / 1584 / 575
Регистрация: 09.10.2013
Сообщений: 3,544
Записей в блоге: 6
Завершенные тесты: 2
03.07.2015, 06:46     Передача функции из одного класса в функцию другого #4
zss, Ваш код не будет работать с большинством компиляторов
Partum Somnia, добавьте к классу Task перегрузку оператора вызова
C++
1
2
3
4
5
6
7
8
class Task{
private: int a;
public:
Task(int aa) { a = aa; }
double operator()(double x){
   return a*x;
}
};
тогда вы сможете использовать объекты этого класса как функции
C++
1
2
3
4
5
6
7
8
class Integ{
private: int a,b;
public:
template<class Functor>
Integral(Functor obj, db x1, db x2, int steps){ ... }
 
void Result(){cout<<Integral(Task(13), 0, 5, 100)}
}
Kastaneda
Форумчанин
Эксперт С++
4479 / 2841 / 227
Регистрация: 12.12.2009
Сообщений: 7,224
Записей в блоге: 1
Завершенные тесты: 1
03.07.2015, 09:09     Передача функции из одного класса в функцию другого #5
Вот так еще можно
C++
1
2
3
4
5
6
...
Integral(std::function<double(double)> fn, blah blah blah);
...
 
Task t;
Integral(std::bind(&task::func, t), blah blah blah);
Добавлено через 39 минут
Кстати а что такое db в
Цитата Сообщение от Partum Somnia
C++
1
Integral(db Function(db x), db x1, db x2, int steps){ ... }
?
Max Dark
шКодер самоучка
1783 / 1584 / 575
Регистрация: 09.10.2013
Сообщений: 3,544
Записей в блоге: 6
Завершенные тесты: 2
03.07.2015, 09:21     Передача функции из одного класса в функцию другого #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот так еще можно
ТС указал ограничение - C++98, а std::bind и std::function это уже C++11 и новее
Цитата Сообщение от Kastaneda Посмотреть сообщение
Кстати а что такое db
как я понял, это сокращение от double

ещё варианты
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
49
50
51
52
53
54
55
56
57
58
/*
Вариант с виртуальной функцией
*/
 
class base_task {
public:
    virtual double function(double) =0;
    virtual ~base_task() {};
};
 
class virt_task:public virt_task {
private:
    int a;
public:
    virt_task(int aa) { a = aa; }
    double function(double x) {
        return a*x;
    }
};
 
class virt_user {
public:
    double use(base_task task, double x1, double x2, double step) {
        double acc = 0.0;
        for(double x = x1; x <= x2; x += step)
            acc += task.function(x);
        return acc;
    }
    void calculate() {
        cout << use(virt_task(13), 0, 5, 0.1);
    }
};
 
/*
вариант с передачей указателя на функцию член
*/
class tmpl_task {
public:
    double some_function_name(double x) {
        return x * x;
    }
};
 
class tmpl_user {
public:
    // для вызова функции-члена нужно указать объект
    // к которому применяется вызов этой функции
    template<class Task>
    double use(Task task, double (Task::*function)(double), double x1, double x2, double step) {
        double acc = 0.0;
        for(double x = x1; x <= x2; x += step)
            acc += (task.*function)(x);
        return acc;
    }
    void calculate() {
        cout << use(tmpl_task(), &tmpl_task::some_function_name, 0, 5, 0.1);
    }
};
Partum Somnia
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 3
03.07.2015, 09:22  [ТС]     Передача функции из одного класса в функцию другого #7
Упс, забыл убрать. db - это typedef double db; У меня почти все переменные либо double либо long double вот и ввёл сокращения.
Max Dark
шКодер самоучка
1783 / 1584 / 575
Регистрация: 09.10.2013
Сообщений: 3,544
Записей в блоге: 6
Завершенные тесты: 2
03.07.2015, 09:25     Передача функции из одного класса в функцию другого #8
там в 11 строке у меня ошибка надо
C++
1
class virt_task: public base_task {
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 09:26     Передача функции из одного класса в функцию другого
Еще ссылки по теме:
Доступ к членам одного класса с другого C++
C++ Преобразование объектов одного класса в объекты другого
C++ Передача метода класса в качестве параметра для метода другого класса
C++ Передача указателя в класс на объект другого класса
как мне функцию одного класса в функцию базового вставить C++

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

Или воспользуйтесь поиском по форуму:
Partum Somnia
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 3
03.07.2015, 09:26  [ТС]     Передача функции из одного класса в функцию другого #9
Большое спасибо. Я надеялся обойтись без функторов и пергрузок функций, ибо с этим ещё слабо знаком, но видимо придётся разобраться.
Ещё раз спасибо.
Yandex
Объявления
03.07.2015, 09:26     Передача функции из одного класса в функцию другого
Ответ Создать тему
Опции темы

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