Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 2
1

Передача метода класса в качестве аргумента внешней функции

11.10.2016, 06:11. Показов 4779. Ответов 4
Метки нет (Все метки)

Столкнулся со следующей проблемой.
Пусть у меня есть некая внешняя функция, которая принимает в качестве аргумента указатель на функцию (у меня это будут функции интегрирования и поиска нулей) (в данном случае я использую самый простой вариант внешней функции). И есть некий класс, в котором есть функции f1 и f2, которая будет использовать внешнюю функцию F.

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
#include <iostream>
 
int F( int( *fun )( int x ), int y ){
  return fun( y );
}
 
class A{
public:
  int f1( int x ){
    return x;
  }
  int f2( int x ){
    return F( &A::f1, x ); // ???
    // return f1( x ); // эта строка, разумеется, работает
  }
};
 
int main(){
  A a;
  int b = 5;
  std::cout << a.f2( b );
  
  int i;
  std::cin >> i;
  return 0;
}
Строка с ??? вызывает ошибку компиляции: error C2664: "int F(int (__cdecl *)(int),int)": невозможно преобразовать аргумент 1 из "int (__thiscall A::* )(int)" в "int (__cdecl *)(int)". На MSDN по ней много всего написано, но это ошибка несоответствия аргументу интерфейсу функции, и про трансформацию указателя на метода класса в простой указатель на функцию там ничего нет. Можно ли как-то заставить внешнюю функцию увидеть внутренний метод? Заранее спасибо!
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2016, 06:11
Ответы с готовыми решениями:

Передача enum в качестве аргумента метода класса
Есть класс //class order; class ticket{ enum type_of_place { coupe, general, berth, wagon_lit...

Передача объекта в качестве аргумента функции (метода)
На &quot;Интуите&quot; имеем код: class Complex { public: int real; // вещественная часть int...

[C++, OpenGL, glut] передача метода класса в качестве параметра функции glutDisplayFunc()
Пишу программу для обхода бинаронго дерева поиска. Программа написана и кажется даже работает, но...

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

4
С чаем беда...
Эксперт CЭксперт С++
9419 / 4919 / 1344
Регистрация: 18.10.2014
Сообщений: 11,455
11.10.2016, 06:14 2
Цитата Сообщение от grati Посмотреть сообщение
Можно ли как-то заставить внешнюю функцию увидеть внутренний метод?
Обычные функции и нестатические методы класса - сущности совершенно разной природы. Передать указатель на метод класса туда, где требуется указатель на обычную функцию - невозможно.

Статический же метод класса - это обычная функция. Указатель на статический метод класса в таком случае будет прекрасно передаваться.

А уж что именно вам надо и подходят ли вам статические методы - это вам виднее. Если не подходят - то все придется переделать несколько по-другому.
0
0 / 0 / 0
Регистрация: 10.10.2016
Сообщений: 2
11.10.2016, 06:18  [ТС] 3
to TheCalligrapher
Да, добавление static к f1 помогает. Но вот смогу ли я сделать метод статическим в своем случае - пойду разбираться. Спасибо!!
0
Эксперт С++
8606 / 4170 / 924
Регистрация: 15.11.2014
Сообщений: 9,437
11.10.2016, 08:55 4
Цитата Сообщение от grati Посмотреть сообщение
Можно ли как-то заставить внешнюю функцию увидеть внутренний метод? Заранее спасибо!
http://rextester.com/AVG30847

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
#include <functional>
#include <iostream>
 
using callback = std::function<int(int)>;
 
int F(const callback& call, const int y) { return call(y); }
 
struct A
{
    int f1(const int x)const { return x; }
    
    int f2(const int x)const
    {
        const auto lambda = [this](const int x){ return this->f1(x); };
        return F(lambda, x);
    }
};
 
int main()
{
    std::cout << "Hello, world!\n";
    A a;
    std::cout << a.f2(5) << '\n';
}
0
0 / 0 / 0
Регистрация: 15.01.2016
Сообщений: 2
11.02.2021, 16:35 5
Столкнулся с такой же проблемой. Метод сделать статическим не могу. Вышел из ситуации передав в функцию указатель на экземпляр класса (через this).
C++
1
2
3
4
5
6
7
8
9
10
11
class MyClass{
  public:
    void MyFunction();  // Какой-то метод
    void MyClass(){     // Какой то метод, в котором нужно вызвать функцию, куда нужно передать метод выше
       f(this);         // Вызов функции куда передаем указатель на текущий экземпляр класса
    }
}
 
void f(MyClass *c){   // Какая-то функция, принимающая экземпляр класса
 c.MуFunction();      // Вызов требуемого метода
}
Возможно это из пушки по воробьям, но другого способа не придумал.
Если кто-то знает решение лучше, пожалуйста сообщите.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2021, 16:35

Указатель на метод класса в качестве аргумента метода класса
Функция _createFun вызывается для создания ХХХ в основном классе. Но вот потребовалось создать ХХХ...

Шаблон в качестве аргумента метода(функции)
Доброго дня! Возник вопрос. Существует ли возможность определить параметр метода, указав тип...

Передача члена класса в качестве параметра метода
Добрый день. Интересует следующий вопрос: как передать член класса как параметр по значению в метод...

Передача функции в качестве аргумента массив
Помогите пожалуйста! есть некая рекурсивная функция N которая принимает 2 целочисленные переменные...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru