Newsgroup: it.comp.lang.c++
Titolo: [?] Codice delle funzioni membri di classe e gestione del comportamento del compilatore

Per alcune classi ho la necessita' di implementare una sorta di callback,
percui ho gia' preparato una struttura in grado di contenere il puntatore a
una funzione dello stesso tipo di quella dell'oggetto.
Non riesco pero' a trovare un modo di convincere il mio simpatico
compilatore a digerire
fptr = CClasse::Function
fptr = this->Function
fptr = &this->Function
o nessun'altra variante che mi sia venuto in mente.
Credo di comprendere anche i motivi per cui non puo' digerirlo, ma se
qualcuno mi dicesse che c'e' un modo di aggirare il problema mi farebbe un
favore.
Secondo poi, avrei bisogno per alcune altre funzioni di classe di
implementare il codice in modo inline. In pratica mi serve che alcune
variabili siano in sola lettura, quindi ho implementato delle funzioni Get
che facciano esattamente questo, ma vorrei evitare l'overhead della coppia
CALL/RET.
Peccato che il compilatore non mi accetti l'inline, ovunque lo metta.
O meglio, il compilatore lo digerisce tutto, ma il linker ci si strozza (non
trova la funzione: grazie al kaiser, non c'e' piu', ho detto al compilatore
di convertirla in codice inline...).
Il compilatore in questione e' MSVCC ma non credo ci siano significative
differenze se e' possibile implementare quanto sopra in C++ standard (anche
perche' poi il tutto deve girare anche sotto GCC).
TIA,
*

 di convertirla in codice inline...).
Qui è meglio se fai un esempio concreto.
Max


A memoria: metto nell'header file
class A
{
public:
        inline int func();
}
e nel cpp
inline int a::func()
{
    return x;
}
poi chiamo dal modulo pippo.cpp una cosa del tipo
return o->func();
(dove o e' un oggetto di classe A) e il linker mi dice che non trova la
funzione int a::func(void) richiamata dal modulo pippo.obj. Stasera
controllo e saro' piu' preciso in merito all'errore, comunque il concetto e'
quello.
Ciaotutti,
*

 quello.
Le funzioni inline devono essere definite in ogni unità di compilazione.
Max


Ripetimelo un attimo? Sarebbe a dire che non posso usarle per gli oggetti? O
che ogni volta che le richiamo devo inserire nello stesso modulo una copia
della funzione? A questo punto che faccio, scrivo la funzione nel .h
dell'oggetto?
Ciaotutti,
*

 wrote:
Dimenticavo: grazie ;)
Ciaotutti,
*

 funzione nel .h dell'oggetto?
Sì, tipicamente le funzioni inline vengono messe negli header.
Max


Grazie.
Ciaotutti,
A.

Anzitutto, grazie per l'aiuto; ho dovuto rivedere un attimo il codice per
farlo funzionare (oltre naturalmente ad usare le classi definitive), perche'
VCC non mi accettava la sintassi che mi avevi dato (istanziare
esplicitamente
un template in VC a quanto pare e' un'operazione un po' particolare), ed il
risultato e':
In un modulo .h generale:
template< class T, int (T::*mf)() >
 void forward_call( void* p )
 {
  (reinterpret_cast<T*>(p)->*mf)();
 }
class callback
{
 typedef int( * ft )( void* );
 ft function;
 void* object;
 public:
 template< class T >
  void bind( T* ptr, int (T::*mf)() )
  {
   function =  &forward_call< T, mf >;
   object = ptr;
  }
  void call()
  {
   function( object );
  }
};
per quanto riguarda la definizione della classe callback, mentre per
collegarlo all'oggetto uso:
PCharList.clr.bind ( this, &CDB::RevalidatePCharList );
dove PCharList e' una struttura e clr e' un membro di tipo callback.
Compilare
compila tutto, prima di dire che funziona aspetto di aver sistemato la parte
di codice che e' da completare.
Comunque ad occhio mi sembra che fili tutto... Considera che e' la prima
votla
che uso i template percui la faccenda non mi e' ancora cristallina :)
Se vedi qualcosa che ti pare strano... Forse lo e', magari c'e' un bug :)
Ciaotutti,
*