C/C++

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

Class A {
void f(void (*d)());
} a;

void q() {};

int main() {
a.f(q);
}

В классе A есть функция f, которая в качестве параметра принимает указатель на функцию. Я вызываю функцию f и передаю ей указатель на функцию q в качестве аргумента. Но этот код не работает. CodeBlocks пишет "undefined reference to A::f(void (*)())". Как мне передать указатель на функцию в качестве аргумента метода класса?
(раньше void q() {} была в классе, дочернем классу А; пока я гуглил, понял, что передача указателя на метод методу другого класса вообще жесть, ну вот, вынес q отдельно)
Адиль Полтушев
Адиль Полтушев
69 560
Дело в том, что у тебя не реализован сам метод f. А не в том, что ты в него функцию передаешь. Нельзя вызывать методы класса, не реализуя их.

А вообще для этого есть std::function, не стоит заниматься подобными поебушками с указателями, а то потом все думают, что C++ сложный :)
Такая же задача в Rust вообще хер решается в полной мере.
Михаил Ханин
Михаил Ханин
92 464
Лучший ответ
Адиль Полтушев точна, не заметил. изменил на void f(void (*d)()) {}, все заработало. спасибо)
В свете последних решений комитета по стандартизации C++ и STL, и шествуя важно на встречу очередной пятилетке, посвящённой обобщённому программированию на селе, на общем собрании колхозников было принято решение отказаться от указателей на функцию, как от пережитков процедурного программирования в пользу шаблонов! Ура, товарищи!!!

#include <iostream>
#include <functional>
#include <fstream>
using namespace std;
long long sum(long a, long b) {
return long long(a) + b;
}
long long sub(long a, long b) {
return long long(a) - b;
}
long long mul(long a, long b) {
return long long(a) * b;
}
class A {
public:
A() : a(0), b(0) {}
A(int a, int b) : a(a), b(b) {}
long long op(function<long long(long, long)> fn) {
return fn(a, b);
}
private:
long a, b;
};
int main() {
long x = 5, y = 7;
A a(x, y);
auto sm = a.op(sum);
auto sb = a.op(sub);
auto ml = a.op(mul);
cout
<< x << " + " << y << " = " << sm << '\n'
<< x << " - " << y << " = " << sb << '\n'
<< x << " * " << y << " = " << ml << '\n';
system("pause > nul");
}
Юрий Кобец
Юрий Кобец
99 139