2017-10-29 3 views
0

생성자에 전달 된 함수 포인터에서 멤버 함수를 초기화하는 방법을 알지 못합니다. 내 클래스에는 차등 문제의 기능이 변경되는 멤버 함수 RHS가 있습니다. 생성자에서 함수를 전달하십시오! 올바른 방법은 무엇입니까?함수 포인터에서 멤버 함수를 초기화하십시오.

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); 
}    

어떻게 setRhs를 정의 할 수 있습니까 ?? 아니면 그렇게하는 것이 가장 좋은 방법일까요? 미리 감사드립니다.

+0

멤버 함수 - 게시 사실을 설정할 수 없습니다. 대부분의 경우'RHS'는 정규 함수 포인터가 될 수 있습니다. – StoryTeller

답변

0

기능 포인터가 일을의 "C"방법입니다. 여기서, this 대답에 제안 당신은 RHS에게 함수 포인터를 만들 수 있습니다 또는 당신은 같은 std::function 사용하여 그것에게 "C++"방법을 수행 할 수 있습니다

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}  
{ } 
: 생성자 자체

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

및 초기화하기를 당신은 요청할 수 있습니다 이유 std::function

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

을을 이유로 :

하거나 setRhs() 내부에 그것을 할 수 있습니다은보다 일반적인 방법입니다 (함수 포인터, lambdas, 오버로드 된 클래스 인 operator()을 허용하며 std::bind에서 std::function을 만들 수도 있습니다).

그러나 std::function은 함수 포인터보다 약간 큰 바이트 코드를 생성 할 수 있습니다.

2

(회원) 기능을 설정할 수 없습니다. C++에서는 함수가 가변적 인 것이 아닙니다.

다행히도 꼭 할 필요는 없습니다. 다음과 같이 호출 나중에

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

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

과 : 당신은 단순히 함수 포인터로 RHS을 정의 할 수 있습니다

double result = RHS(x, y); 
관련 문제