函数指针 C++
Function pointer c++
我正在尝试在 class DPkDispersionMemNK
.
的函数上使用函数指针
我不明白为什么它不起作用
你能帮帮我吗?
DPkDispersionMemKN.hpp中的代码:
#include "DPkDispersion.hpp"
class DPkDispersionMemKN : public DPkDispersion {
protected:
float** matrixDP;
std::pair<float,int> (DPkDispersionMemKN::*func)(int k, int i);
public:
std::pair<float,int> computeDich(int k, int i);
std::pair<float,int> computeSum(int k, int i);
std::pair<float,int> computeMin(int k, int i);
void setfunc( std::pair<float,int> (&fonction)(int, int)) { func= fonction;};
};
我希望我可以在它们上面使用指针的 3 个函数:(它们在 DPkDispersionMemKN.cpp 中)(这并不重要)
std::pair<float,int> DPkDispersionMemKN::computeSum(int k, int i) {
float max=0;
int ind= 0;
for (int j = k - 1; j <= i - 1; j++ ) {
if (matrixDP[k-1][j] + dist(j, i) > max) {
max = matrixDP[k-1][j] + dist(j, i);
ind = j;
}
}
return make_pair(max,ind);
}
std::pair<float,int> DPkDispersionMemKN::computeMin(int k, int i) {
float max=0;
int ind= 0;
for (int j = k - 1; j <= i - 1; j++) {
if (min(matrixDP[k-1][j], dist(j, i)) > max){
max = min(matrixDP[k-1][j], dist(j, i));
ind = j;
}
}
return make_pair(max,ind);
}
std::pair<float,int> DPkDispersionMemKN::computeDich(int k, int i) {
int j;
int a=k-1;
int b = i-1;
while (b-a >= 2) {
j = (i+(a+b)) / 2;
if (matrixDP[k-1][j]-dist(j, i) > 0) {
b = j;
} else {
a = j;
}
}
if (min(matrixDP[k-1][a], dist(a, i)) < min(matrixDP[k-1][b], dist(b, i))) {
return make_pair(min(matrixDP[k-1][b], dist(b, i)), b);
} else {
return make_pair(min(matrixDP[k-1][a], dist(a, i)), a);
}
}
最后,在 main.cpp:
solver3.setfunc(&DPkDispersionMemKN::computeMin);
我希望我可以在我想使用的主要 功能中进行选择,但它不起作用。
感谢您的帮助!
In file included from DPkDispersionMemKN.cpp:1:
./DPkDispersionMemKN.hpp:35:68: error: assigning to 'std::pair<float, int>
(DPkDispersionMemKN::*)(int, int)' from incompatible type
'std::pair<float, int> (int, int)'
...setfunc( std::pair<float,int> (&fonction)(int, int)) { func= fonction;};
^~~~~~~~
你需要:
void setfunc(std::pair<float,int> (DPkDispersionMemKN::*fonction)(int, int)) { func = fonction;}
用法类似于:
std::pair<float, int> res = (this->*func)(someI, someJ);
您在 setfunc
中使用了错误的类型。编译器甚至告诉你(强调我的):
In file included from DPkDispersionMemKN.cpp:1:
./DPkDispersionMemKN.hpp:35:68: error: assigning to '
std::pair<float, int> (DPkDispersionMemKN::*)(int, int)
' from incompatible type '
std::pair<float, int> (int, int)
std::pair<float, int> (DPkDispersionMemKN::*)(int, int)
是函数类型。但这不是您在声明 setfunc
的参数时使用的类型。你在那里使用了不同的类型。将其更改为正确的类型。
指向非静态成员函数的指针需要调用 class 的实例。
std::pair<float,int> (DPkDispersionMemKN::*func)(int k, int i);
DPkDispersionMemKN d;
auto p = (d.*)func(1, 2);
std::pair<float,int> (*f)(int, int);
auto p2 = f(1, 2);
这就是您遇到编译错误的原因。
根据您的需要,您可以将方法更改为静态的,也可以切换到 std::function
我正在尝试在 class DPkDispersionMemNK
.
我不明白为什么它不起作用
你能帮帮我吗?
DPkDispersionMemKN.hpp中的代码:
#include "DPkDispersion.hpp"
class DPkDispersionMemKN : public DPkDispersion {
protected:
float** matrixDP;
std::pair<float,int> (DPkDispersionMemKN::*func)(int k, int i);
public:
std::pair<float,int> computeDich(int k, int i);
std::pair<float,int> computeSum(int k, int i);
std::pair<float,int> computeMin(int k, int i);
void setfunc( std::pair<float,int> (&fonction)(int, int)) { func= fonction;};
};
我希望我可以在它们上面使用指针的 3 个函数:(它们在 DPkDispersionMemKN.cpp 中)(这并不重要)
std::pair<float,int> DPkDispersionMemKN::computeSum(int k, int i) {
float max=0;
int ind= 0;
for (int j = k - 1; j <= i - 1; j++ ) {
if (matrixDP[k-1][j] + dist(j, i) > max) {
max = matrixDP[k-1][j] + dist(j, i);
ind = j;
}
}
return make_pair(max,ind);
}
std::pair<float,int> DPkDispersionMemKN::computeMin(int k, int i) {
float max=0;
int ind= 0;
for (int j = k - 1; j <= i - 1; j++) {
if (min(matrixDP[k-1][j], dist(j, i)) > max){
max = min(matrixDP[k-1][j], dist(j, i));
ind = j;
}
}
return make_pair(max,ind);
}
std::pair<float,int> DPkDispersionMemKN::computeDich(int k, int i) {
int j;
int a=k-1;
int b = i-1;
while (b-a >= 2) {
j = (i+(a+b)) / 2;
if (matrixDP[k-1][j]-dist(j, i) > 0) {
b = j;
} else {
a = j;
}
}
if (min(matrixDP[k-1][a], dist(a, i)) < min(matrixDP[k-1][b], dist(b, i))) {
return make_pair(min(matrixDP[k-1][b], dist(b, i)), b);
} else {
return make_pair(min(matrixDP[k-1][a], dist(a, i)), a);
}
}
最后,在 main.cpp:
solver3.setfunc(&DPkDispersionMemKN::computeMin);
我希望我可以在我想使用的主要 功能中进行选择,但它不起作用。
感谢您的帮助!
In file included from DPkDispersionMemKN.cpp:1:
./DPkDispersionMemKN.hpp:35:68: error: assigning to 'std::pair<float, int>
(DPkDispersionMemKN::*)(int, int)' from incompatible type
'std::pair<float, int> (int, int)'
...setfunc( std::pair<float,int> (&fonction)(int, int)) { func= fonction;};
^~~~~~~~
你需要:
void setfunc(std::pair<float,int> (DPkDispersionMemKN::*fonction)(int, int)) { func = fonction;}
用法类似于:
std::pair<float, int> res = (this->*func)(someI, someJ);
您在 setfunc
中使用了错误的类型。编译器甚至告诉你(强调我的):
In file included from DPkDispersionMemKN.cpp:1:
./DPkDispersionMemKN.hpp:35:68: error: assigning to '
std::pair<float, int> (DPkDispersionMemKN::*)(int, int)
' from incompatible type '
std::pair<float, int> (int, int)
std::pair<float, int> (DPkDispersionMemKN::*)(int, int)
是函数类型。但这不是您在声明 setfunc
的参数时使用的类型。你在那里使用了不同的类型。将其更改为正确的类型。
指向非静态成员函数的指针需要调用 class 的实例。
std::pair<float,int> (DPkDispersionMemKN::*func)(int k, int i);
DPkDispersionMemKN d;
auto p = (d.*)func(1, 2);
std::pair<float,int> (*f)(int, int);
auto p2 = f(1, 2);
这就是您遇到编译错误的原因。 根据您的需要,您可以将方法更改为静态的,也可以切换到 std::function