Newsgroup: it.comp.lang.c++
Titolo: puntatore funzione membro c2440

Salve
ho la seguente classe
classe miaclasse
{ double fun1(const double&,const int&);
  double fun2(const double&,const int&);
  ......
 private:
---
double (*f)(const double&,const int&);
};
ora in una funzione membro tipo
void (bool b)
{
  if (b==true)
   f=&miaclasse::fun1;
else
  f=&miaclasse::fun2;
}
ovvero selezionare fun1 o fun2 a seconda dell'input b?
ricevo questo errore
come posso evitare l'errore 2440 vc++
error C2440: '=' : cannot convert from 'double (__thiscall
miaclasse::* )(const double &,const int &)' to 'double (__cdecl *)
(const double &,const int &)'
grazie!

 ha scritto nel messaggio 
news:1191067832.9...@22g2000hsm.googlegroups.com...

Eccoti una versione compilabile:
class miaclasse
{
    public:
        double fun1(const double&,const int&);
        double fun2(const double&,const int&);
    private:
        double (*f)(const double&,const int&);
};
void fun(bool b)
{
    double ( miaclasse::*f )(const double&,const int&);
    if (b==true)
        f=&miaclasse::fun1;
    else
        f=&miaclasse::fun2;
}
int main()
{
    return 0;
}
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 - Show quoted text -
Grazie,
ma ora c'è un altro problema. Il puntatore f quando chiamo bool( ..)
punta alla funzione mebro desiderata ma quando termina bool f risulta
vuoto!
Compila ma non in debug quando una funzione della classe chiama f essa
è vuota (punta a   0xcccccccc )
Errore è
Eccezione non gestita a 0xcccccccc in miaclasse.exe: 0xC0000005:
Violazione di accesso nella lettura del percorso 0xcccccccc.

 double (*f)(const double&,const int&);
questa dichiarazione presuppone un generico puntatore a funzione 
NON membro. Potrebbe andare, se ben ricordo, se dichiari le due 
funzioni fun1 e fun2 di tipo STATIC (e quindi di fatto non più 
parte intergrante di un singolo oggetto di classe miaclasse, ma 
solo parte dell'interfaccia "generica", che prescinde dalle 
istanze). Ovviamente così facendo dentro tali funzioni non hai 
più nozione del puntatore THIS di default, e se devi accedere a 
dati di istanza, devi passare un argomento esplicito.
Volendo mantenere le funzioni come membri di istanza, dichiara 
il puntatore in modo compatibile
double (miaclasse :: * f)(const double&,const int&);
// qui sottolinei che il puntatore è a membro di miaclasse. A 
meno di casting strani, non potrai associare ad esso qualsiasi 
funzione esterna che abbia match esatto di argomenti e valore di 
ritorno però.
Ah, poi, ti conviene dichiarare una comoda typedef
typedef double (miaclasse :: * ptrFunzMembroMiaclasse)(const 
double&,const int&);
//su questo non ho controllato la sintassi, potrebbe essere da 
correggere ... ma il concetto è giusto e comodo
ciao
Soviet


 - Show quoted text -
Ho provato come da te proposto,ma ora ho un errore in compilazione,
mentre con la soluzione precedente avevo un errore a runtime.
Ecco
Esempio
classe miaclasse
 { double fun1(const double&,const int&);
   double fun2(const double&,const int&);
   double calcola(const double &,const int &);
  double  generic(const double &);
  private:
 //come suggerito
 double (miaclasse::*f)(const double&,const int&);
};
ora una esmpio di implementazione
double miaclasse::generic(const double &x)
{
    double a=0.0;
     for (int i=0; i< q;i++)
        a+=f(x,i);
return a;
}
double miaclasse::calcola(const double &input,const int&flag)
{   if (flag==1)
   f=&miaclasse::fun1;
 else
   f=&miaclasse::fun2;
  double result=generic(input);
return result;
}
Quindi a seconda del flag la funzione membro generic calcola f(x,i)
usando fun1 o fun2 che hanno come input  (const double &,const int &).
Quando viene chiamata generic e precisamente in   a+=f(x,i);  c'è
questo errore
error C2064: term does not evaluate to a function taking 2 arguments
Grazie!

 - Show quoted text -
Risolto...avevo provato con this->*f(x,i) ma non andava ..ci volevano
le parentesi!!!!!
(this->*f)(x,i)
grazie lo stesso!

 vuoto!
Se parli del f definito come variabile locale automatica della funzione 
fun() allora è normale. Il suo scope è all'interno della funzione stessa.


 (this->*f)(x,i)
Suggerirei di cercare di capire dove stanno gli errori, perchč, etc etc
etc. Con il C++ andare di prova, sbaglia e metti a posto non č un
sentiero ne breve ne sicuro.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.

 ha scritto nel messaggionews:1191142329....@r29g2000hsg.googlegroups.com...

No f e definito nella classe come private
class miaclasse{
  private:


 No f e definito nella classe come private
Ma tu non fai alcun riferimento ad esso nella funzione fun().
Mi associo al consiglio di prenderti un buon libro sul C++ e di cominciare a 
studiartelo seriamente.
