它必須是一個靜態函數!
#include <iostream>
#include <cassert>
class A {
public:
static double MethA(double x) { return 5 * x; }
};
typedef double (*ftype)(double);
double function(ftype f) {
assert(f != NULL);
return f(7);
}
int main(int, char**) {
// expect "35\n" on stdout
std::cout << function(A::MethA) << "\n";
}
它必須是靜態的,因爲你可以「T訪問任何一個的變量不知道一個對象你指到如果需要的非靜態成員變量,你需要一個一個的引用傳遞到靜態函數:
#include <iostream>
#include <cassert>
class A {
double fX;
public:
A(double x) : fX(x) { }
double methB(double x) const { return fX * x; }
static double MethB(double x, const A& a) {
return a.methB(x);
}
};
typedef double (*ftype2)(double, const A&);
double function_with_context(ftype2 f, const A& a) {
assert(f != NULL);
return f(7, a);
}
int main(int, char**) {
A a(6);
// expect "42\n" on stdout
std::cout << function_with_context(A::MethB, a) << "\n";
}
但它的有時更好地使用繼承和多態來實現這種接口:
#include <iostream>
class MyInterface {
public:
virtual double f(double x) const = 0;
};
class A : public MyInterface {
double fX;
public:
A(double x) : fX(x) { }
double f(double x) const {
return fX * x;
}
};
double function(const MyInterface& o) {
return o.f(7);
}
int main(int, char**) {
A a(6);
// expect "42\n" on stdout
std::cout << function(a) << "\n";
}
請拼寫正確。 'class'是小寫字母,最後需要分號。細節,但編程是關於細節。 –
爲什麼寫代碼充其量是不可理解的?你有虛擬功能。傳入一個具有其中一個的對象,並使代碼可讀 –
指向成員函數的指針具有與函數指針不同的類型 –