2017-10-29 2 views
0

Ich weiß nicht, wie eine Mitgliedsfunktion von Funktionszeiger auf Konstruktor übergeben wird. meine Klasse haben eine Mitgliedsfunktion RHS, die in Funktion der Differentialprobleme ändern .. so muss ich Übergeben Sie eine Funktion im Konstruktor! Was ist der richtige Weg?initialisieren Mitgliedsfunktion von Funktionszeiger

class RhsOdeProblem 
{ 
    public:  
     // constructor without alalitical solution 
    constexpr RhsOdeProblem (double (*rhs)(double, double), 
           double, double, double, double) noexcept ;  


    virtual ~RhsOdeProblem() noexcept = default ; 
    RhsOdeProblem(const RhsOdeProblem&) noexcept = default; 
    RhsOdeProblem(RhsOdeProblem&&) noexcept = default ; 



    double RHS(double, double); 
    double AnaSol(); 

    double dxdt(double, double);     

    void setRhs(double (*rhs)(double, double)); 
    void setAnaliticalSolution(double (*realSol)(double,double));  

    double startTime ; 
    double endTime ; 
    double dt  ; 
    double initValue ; 
    constexpr static double eps = 10e-8 ; 
    bool analiticalSolution ; 
}; 

constexpr RhsOdeProblem::RhsOdeProblem (double (*rhs)(double, double), 
             double ti, 
             double tf, 
             double dt, 
             double y0) noexcept : startTime{ti}, endTime{tf}, 
                 dt{dt} , initValue{y0} , 
                 analiticalSolution{false}  
{      
     setRhs(rhs); 
}    

Wie kann ich setRhs definieren ?? oder was ist der beste Weg? Vielen Dank im Voraus

+0

Sie können keine Mitgliedfunktion-Post-Fakt festlegen. Sie können höchstens "RHS" als normalen Funktionszeiger verwenden. – StoryTeller

Antwort

0

Funktionszeiger die „C“ Art und Weise, Dinge zu tun sind. Hier können Sie die rechte Seite einen Funktionszeiger machen wie in this Antwort vorgeschlagen oder Sie können es die „C++“ Art und Weise tun, indem Sie std::function wie:

#include <functional> 
class RhsOdeProblem 
{ 
    // ... 
    std::function<double(double,double)> RHS; 
    //... 
}; 

und intialize im Konstruktor selbst:

constexpr RhsOdeProblem::RhsOdeProblem (std::function<double(double,double)> rhs, 
            double ti, 
            double tf, 
            double dt, 
            double y0) noexcept : startTime{ti}, endTime{tf}, 
                dt{dt} , initValue{y0} , 
                 analiticalSolution{false}, 
RHS{rhs}  
{ } 

oder Sie können es innerhalb setRhs() tun:

void RhsOdeProblem::setRhs(std::function<double(double,double)> rhs) { 
    RHS = rhs; 
} 

warum std::function können Sie fragen, weil std::function ist eine allgemeinere Art, dies zu tun (es akzeptiert Funktionszeiger, Lambdas, Klassen mit überladenen operator() und Sie können auch std::function von std::bind erstellen).

Aber, std::function könnte einen etwas größeren Byte-Code als Funktionszeiger erzeugen.

2

Sie können keine (Mitglieds-) Funktion einstellen. Eine Funktion ist in C++ keine veränderbare Sache.

Glücklicherweise müssen Sie nicht; Sie können einfach RHS definieren einen Funktionszeiger zu sein:

class RhsOdeProblem 
{ 
    // ... 
    double (*RHS)(double, double); 
    void setRhs(double (*rhs)(double, double)); 
}; 

void RhsOdeProblem::setRhs(double (*rhs)(double, double)) { 
    RHS = rhs; 
} 

und später es so nennen:

double result = RHS(x, y); 
Verwandte Themen