2012-07-02 6 views
0

Мое положение следующее, у меня есть две разные функции деления, которые будут вызываться в какой-то момент моего кода. В основном некоторые функции вызывают Bisection2, и эта функция вызывает либо переданную функцию, либо передает указатель на функцию Bisection.Передача элемента функции указателя (-ов)

в заголовке У меня есть

std::vector<double> F(); 
double F1(double m1, double m2); 
double F2(double m1, double m2); 
typedef double (MyClass::*MyClassFn)(double,double); 
double Bisection(MyClassFn fEval,double min, double max,std::vector<double> args); 
bool Bisection2(MyClassFn fEval1,MyClassFn fEval2,double xmin, double xmax, double ymin, double ymax,double *ax, double *ay,std::vector<double> args); 

И мои функции Bisection выглядеть следующим образом. Я не включил весь код, потому что это не обязательно.

double MyClass::F1(double m1, double m2) { 
    m_m1 = m1; 
    m_m2 = m2; 
    F(); 
    return m_my; 
} 

double MyClass::F2(double m1, double m2) { 
    m_m1 = m1; 
    m_m2 = m2; 
    F(); 
    return m_mx; 
} 
double MyClass::Bisection(MyClass fEval,double min, double max,std::vector<double> args) 
{ 
    // Setting a lot of stuff here, including auxiliary and leftvalue... 

    MyClass *pObj = new MyClass(-1); 

    leftvalue = pObj->*fEval(auxiliary, left); 
    ightvalue = pObj->*fEval(auxiliary, right); 

    // Comparing and setting values here etc. 
} 
bool MyClass::Bisection2(MyClassFn fEval1,MyClassFn fEval2,double xmin, double xmax, double ymin, double ymax,double *ax, double *ay,std::vector<double> args) 
{ 

    // Setting some values here but these have nothing to do with the problem. 
    double yl; 
    double leftvalue, rightvalue, middlevalue; 

    MyClass *pObj = new MyClass(-1); 

    // Setting some values here but these have nothing to do with the problem. 
    std::vector <double> arg; 
    // pushing some values 

    yl = Bisection(fEval2,ymin,ymax,arg); // Here is the first way how I need to pass fEval2 to Bisection function. 
    arg.clear(); 

    if(isnan(yl)) 
    { 
     return M_NAN; 
    } 
    leftvalue = pObj->fEval1(xl, yl); // And here is the second way how I need to use fEval1. 

//..... 
} 

И тогда я в основном функции, что вызывает

`Bisection2 (F1, F2, m_m2,0.0, 0,0, m_max2, & m_mu1, & m_mu2, арг);

В настоящий момент звонок Bisection2 (...) может быть некорректным, потому что я много раз менял функции, так как это работало в последний раз. В прошлый раз я в основном называл указатели функций F1 и F2 непосредственно внутри функций вместо fEval, но я совершенно уверен, что это был неправильный способ, поскольку даже подумал, что это как-то работает.

Теперь leftvalue = pObj -> * fEval (вспомогательный, левый); вызывает ошибку компиляции:

error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘fEval (...)’, e.g. ‘(... ->* fEval) (...)’ 

Я пытался увидеть помощь здесь http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.2 , а также проверил, возможно, различные решенные проблемы в этих форумах, но до сих пор не могу понять, что я делаю неправильно.

спасибо.

+0

В * определение * из '' параметра Bisection' fEval' объявляется как имеющий тип MyClass. Это неверно. Предполагается, что это 'MyClassFn', как в объявлении' Bisection'. – AnT

ответ

4

Как говорится в сообщении об ошибке, вам нужны скобки. Это происходит потому, что вызов функции имеет более высокий приоритет, чем оператор ->*:

leftvalue = (pObj->*fEval)(auxilary, left); 
      ^  ^

Кроме того, вы почти наверняка не следует использовать new здесь; Вы можете исправить утечки памяти с использованием автоматического хранения:

MyClass obj(-1); 
leftvalue = (obj.*fEval)(auxiliary, left); 
+0

Большое вам спасибо! Честно говоря, я использовал смехотворное количество времени, переписывая и отлаживая эти функции (дни). Когда я должен был задать этот вопрос сначала, потому что это был мой первый подход к этим функциям -_- – Mare2

0

Это просто вопрос приоритета: Вместо того чтобы делать pObj->*fEval(aux, left), просто сделать (pObj->*fEval)(aux, left)

Смежные вопросы