Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

03.07.2015, 04:58. Просмотров 756. Ответов 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 файлах написаны.)
Заранее примного благодарен.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.07.2015, 04:58
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача функции из одного класса в функцию другого (C++):

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

Сам вопрос: почему функция-член одного класса не вызывается из функции-члена другого класса? - C++
//Щас всё объясню. Так, имеем два класса, в одном я определил функцию-член. Все конструкторы и прочее //опущены для уменьшения кода ...

Передача функции (как параметра) в функцию унаследоваемого класса - C++
Доброго времени суток. Есть класс (в моем случае это Sprite) и я создаю произвольный класс (например Game : public Sprite). У меня есть в...

Как переместить из стека одного класса в массив другого класса? - C++
// HW_on.24.11_classStack_SantaClaus.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include...

Объявление объекта одного класса в описании другого класса - C++
Здравствуйте. Почему при объявлении Student s в классе Teacher не возникает ошибки? Ведь такой объект уже существует. И почему при...

Передача свойства одного экземпляра класса другому экземпляру класса - C++
#include &lt;tchar.h&gt; class A { public: A(); int aVar; }; class B : public A

8
zss
Модератор
Эксперт С++
6883 / 6445 / 2155
Регистрация: 18.12.2011
Сообщений: 16,938
Завершенные тесты: 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); // Цифры вставил просто для примера. 
}
0
ReDoX
25 / 25 / 14
Регистрация: 01.07.2015
Сообщений: 82
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;
};
0
Max Dark
шКодер самоучка
1866 / 1666 / 605
Регистрация: 09.10.2013
Сообщений: 3,707
Записей в блоге: 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)}
}
2
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,493
Записей в блоге: 2
Завершенные тесты: 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){ ... }
?
1
Max Dark
шКодер самоучка
1866 / 1666 / 605
Регистрация: 09.10.2013
Сообщений: 3,707
Записей в блоге: 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);
    }
};
1
Partum Somnia
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 3
03.07.2015, 09:22  [ТС] #7
Упс, забыл убрать. db - это typedef double db; У меня почти все переменные либо double либо long double вот и ввёл сокращения.
0
Max Dark
шКодер самоучка
1866 / 1666 / 605
Регистрация: 09.10.2013
Сообщений: 3,707
Записей в блоге: 6
Завершенные тесты: 2
03.07.2015, 09:25 #8
там в 11 строке у меня ошибка надо
C++
1
class virt_task: public base_task {
0
Partum Somnia
0 / 0 / 0
Регистрация: 03.07.2015
Сообщений: 3
03.07.2015, 09:26  [ТС] #9
Большое спасибо. Я надеялся обойтись без функторов и пергрузок функций, ибо с этим ещё слабо знаком, но видимо придётся разобраться.
Ещё раз спасибо.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.07.2015, 09:26
Привет! Вот еще темы с ответами:

Доступ к членам одного класса с другого - C++
Есть три файла: A.cpp: #include &quot;B.cpp&quot; class AA { int A; public: AA(int a) { A = a;

Доступ одного класса к данным другого - C++
Здравствуйте. Интересует следующий вопрос: Есть два класса, &quot;Вектор&quot; и &quot;Матрица&quot;. Их реализации содержатся в двух разных файлах. Возникла...

Преобразование объектов одного класса в объекты другого - C++
Есть сей код.Тут я пытаюсь осуществить преобразование объекта класса myCl к классу myCl2. Код вызывает завершение работы компилятора. В чем...

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


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

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

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