在这种情况下,如何在 C++ 中正确地将成员函数作为参数传递?
How to properly pass member function as argument in this situation in C++?
我想将我的 C++ class 的一个成员函数传递给同一个 class 的另一个成员函数。我做了一些研究并在 SO 上发现了这些类似的问题。
Passing a member function as an argument in C++
Function pointer to member function
他们没有以相同的方式涵盖我的具体情况,但我编写了我的代码并且认为我调整了正确的部分以使其适用于我的情况。但是,编译器似乎不同意我的观点...
我的 C++ 中有以下设置 class:
CutDetector.h
class CutDetector {
double thresholdForFrameIndex(int frameIndex, vector<double> diffs, int steps, double (CutDetector::*thresholdFunction)(vector<double>diffs)); // should take other functions as args
double calcMean(vector<double> diffs); // should be passed as argument
double calcMeanMinMax(vector<double> diffs); // should be passed as argument
double calcMedian(vector<double> diffs); // should be passed as argument
}
CutDetector.h
double thresholdForFrameIndex(int frameIndex, vector<double> diffs, int steps, double (CutDetector::*thresholdFunction)(vector<double>diffs)) {
vector<double> window = ... init the window vector ;
double threshold = thresholdFunction(window);
return threshold;
}
但是,像这样将 thresholdFunction
作为参数传递是行不通的。编译器报错如下:
error: called object type 'double (CutDetector::*)(vector<double>)'
is not a function or function pointer
谁能看出为什么我的设置不起作用并建议我如何才能让它起作用?基本上我想要的是能够将计算 threshold(即 calcMean
、calcMeanMinMax
、calcMedian
)的任何成员函数传递给另一个成员函数 thresholdForFrameIndex
.
要调用指向成员函数的指针,您需要提供一个对象:
double threshold = (this->*thresholdFunction)(window);
^^^^^^^^ ^
如果没有 class 的实例,则不能调用成员函数。你需要做这样的事情:
CutDetector cd;
double threshold = (cd.*thresholdFunction)(window);
或者如果您在某处有一个 CutDetector
指针:
double threshold = (pcd->*thresholdFunction)(window);
或者如果thresholdForFrameIndex
是一个成员函数:
double threshold = (this->*thresholdFunction)(window);
我认为你在这里制作 calcMean
、calcMeanMinMax
和 calcMedian
static 函数并像所有其他函数一样对待会更容易非成员函数。其他答案是正确的,但在你的情况下,我想这对 class 设计会更好。
我想将我的 C++ class 的一个成员函数传递给同一个 class 的另一个成员函数。我做了一些研究并在 SO 上发现了这些类似的问题。
Passing a member function as an argument in C++
Function pointer to member function
他们没有以相同的方式涵盖我的具体情况,但我编写了我的代码并且认为我调整了正确的部分以使其适用于我的情况。但是,编译器似乎不同意我的观点...
我的 C++ 中有以下设置 class:
CutDetector.h
class CutDetector {
double thresholdForFrameIndex(int frameIndex, vector<double> diffs, int steps, double (CutDetector::*thresholdFunction)(vector<double>diffs)); // should take other functions as args
double calcMean(vector<double> diffs); // should be passed as argument
double calcMeanMinMax(vector<double> diffs); // should be passed as argument
double calcMedian(vector<double> diffs); // should be passed as argument
}
CutDetector.h
double thresholdForFrameIndex(int frameIndex, vector<double> diffs, int steps, double (CutDetector::*thresholdFunction)(vector<double>diffs)) {
vector<double> window = ... init the window vector ;
double threshold = thresholdFunction(window);
return threshold;
}
但是,像这样将 thresholdFunction
作为参数传递是行不通的。编译器报错如下:
error: called object type
'double (CutDetector::*)(vector<double>)'
is not a function or function pointer
谁能看出为什么我的设置不起作用并建议我如何才能让它起作用?基本上我想要的是能够将计算 threshold(即 calcMean
、calcMeanMinMax
、calcMedian
)的任何成员函数传递给另一个成员函数 thresholdForFrameIndex
.
要调用指向成员函数的指针,您需要提供一个对象:
double threshold = (this->*thresholdFunction)(window);
^^^^^^^^ ^
如果没有 class 的实例,则不能调用成员函数。你需要做这样的事情:
CutDetector cd;
double threshold = (cd.*thresholdFunction)(window);
或者如果您在某处有一个 CutDetector
指针:
double threshold = (pcd->*thresholdFunction)(window);
或者如果thresholdForFrameIndex
是一个成员函数:
double threshold = (this->*thresholdFunction)(window);
我认为你在这里制作 calcMean
、calcMeanMinMax
和 calcMedian
static 函数并像所有其他函数一样对待会更容易非成员函数。其他答案是正确的,但在你的情况下,我想这对 class 设计会更好。