假设我有两个不同的类,如下所示
class Nonlinear
{
public:
double NonlinearFunc(ParameterList) //it is a nonlinear function
};
class Solver
{
public:
double FuncEvaluation(ParameterList) //evaluate a function
};
double Solver::FuncEvaluation(ParameterList)
{
????? //evaluate function from other class
}
main()
{
Nonlinear nl;
Solver solve;
double a;
double b;
a = nl.NonlinearFunc(ParameterList);
b = solve.FuncEvaluation(ParameterList);
//what I want is a=b
}
如何使用成员函数指针,以便Solver :: FunEvaluation评估Nonlinear :: NonlinearFunc?
答案 0 :(得分:2)
听起来您希望Solver::FuncEvaluation()
执行Nonlinear::NonlinearFunc()
,这是正确的吗?如果是这样,我会这样做:
class Evaluatable
{
public:
virtual double Evaluate(ParameterList) = 0;
};
class Nonlinear : public Evaluatable
{
public:
double Evaluate(ParameterList);
};
class Solver
{
public:
double FuncEvaluation(Evaluatable &expression, ParameterList);
};
double Solver::FuncEvaluation(Evaluatable &expression, ParameterList params)
{
return expression.Evaluate(params);
}
main()
{
Nonlinear nl;
Solver solve;
double a;
a = solve.FuncEvaluation(nl, ParameterList);
}
答案 1 :(得分:1)
如果你只想评估这个函数,你实际上不需要使用指向成员的指针,你可以直接调用:
class Solver
{
public:
Solver(Nonlinear& nl) : mNl(nl) {}
double FuncEvaluation(ParameterList) //evaluate a function
private:
Nonlinear& mNl;
};
Solver::FuncEvaluation(ParameterList l)
{
return mNl.NonLinearFunc(l);
}
否则你必须使用指向成员函数的指针并仍然传递对象实例。
答案 2 :(得分:1)
您想从NonLinear::NonLinearFunc()
致电Solver::FuncEvaluation
。
由于您的课程Solver
不是来自课程NonLinear
,而NonLinearFunc()
是课程NonLinear
的成员函数,您必须拥有FuncEvaluation
类x
的对象(我们称之为NonLinear
),例如,其中一个参数。
如果是这种情况,您不需要指向成员函数的指针,只需调用函数:
x.NonLinearFunc(...) // or x->NonLinearFunc(...) if you work with pointers.
如果您有几个类似的成员函数并且想要动态选择一个成员函数,那么指向成员函数的指针才有意义。
修改:
使用指向成员函数的指针时,如果确实需要,请执行以下操作:
double (NonLinear::*f)(...); // declare a pointer to a member function of Nonlinear
f = &A::NonLinearFunc; // Assign the address of the function to the pointer. Note the mandatory &
(x.*f)(...); // call the function pointed to, using NonLinear object x with the given parameters
请注意,在此示例中,指针f
不是NonLinear
的成员,而是具有类型“指向类NonLinear
的成员函数的指针”的变量。它将是你的解算器的变量。
答案 3 :(得分:1)
听起来你希望函数FuncEvaluation
能够接受任何(成员)函数作为参数,并使用自己的参数对其进行评估。
在现代C ++中,您可以执行类似 1 :
的操作struct Solver {
template <typename Callable, typename... Args>
auto funcEvaluation(Callable&& c, Args&&... args) {
return std::forward<Callable>(c)(std::forward<Args>(args)...);
}
};
并使用它,例如:
struct NonLinear {
/* Some member function */
double nonLinearFunc(double x, double y, int m) {
return (x + y) * m; // (Not non-linear but serving as a simple example.)
}
};
int main() {
Solver s;
NonLinear nl;
// Use standard library call wrapper for member functions.
auto c = std::mem_fn(&NonLinear::nonLinearFunc);
// When using call wrapper you need to pass instance 'nl' as parameter.
std::cout << s.funcEvaluation(c, nl, 1.0, 2.0, 2) << std::endl;
// Outputs 6.0
}
1:您需要C ++ 1y支持函数返回类型推导才能工作。