[英]C++ to port member function from other classes
假設我有兩個不同的類,如下所示
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?
聽起來您想讓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);
}
如果只想評估函數,則實際上不需要使用指向成員的指針,您可以直接進行調用:
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);
}
否則,您將不得不使用指向成員函數的指針,並且仍然傳遞對象實例。
您想從Solver::FuncEvaluation
調用NonLinear::NonLinearFunc()
。
當你的類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
類的成員函數的指針”的變量。 這將是您的求解器的變量。
對我來說,聽起來像您希望函數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支持,才能使用函數返回類型推導。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.