簡體   English   中英

C ++移植其他類的成員函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM