Newsgroup: it.comp.lang.c++
Titolo: Re: Errore di compilatione su operatore ->

"Il Vampiro Casimiro" <satorA...@project-SPAM.com> ha scritto nel 
messaggio news:0A9Be.64037$h5.27...@news3.tin.it...
|
| Ho una struttura simile a questa:
|
| typedef struct
| {
|
|    tipomio t;
|    bool v;
|
| } elemento;
|
|
| Ovviamente 'tipomio' e' una classe da me definita .
|
| Adesso creo un vector di 'elemento'...
|
| std::vector<elemento> caratteristica;
|
| Questo vector nel corso del programma sara' riempito di elementi. Ad un
| certo punto ho bisogno di scorrere il vector e settare a 'true' ogni
| booleano; pertanto inserisco in un ciclo la seguente istruzione...
|
| caratteristica[indice]->v = true;
|
| Ma dal compilatore ricevo in risposta questo errore:
| "base operand of '->' has non-pointer type of 'elemento' "
|
| Lo stesso errore compare se provo ad accedere al campo 'tipomio'.
|
| Ora, ho come l'impressione che l'errore sia banale: dovuto alla mia non
| perfetta conoscenza dell'uso di '->', ma al momento non riesco a capire
| che cosa sbaglio...
|
l'operatore -> si usa per accedere ai campi di un puntatore (beh, non solo, 
ma non complichiamo le cose ora..). Poichè tu hai un vector non di puntatori 
ma di ogetti direttamente allora devi usare l'operatore .: 
caratteristica[indice].v = true;
ciao,
gianluca
|
| 



 
No. La "roba" a sinistra di '->' dev'essere un puntatore (salvo overloading
dell'operatore, ovviamente).
Per invocare la funzione denotata da 'ptr_funz', scriverai:
 bool risu = (caratteristica[indice].ptr_funz)() ;
Max

 caratteristica[indice].v = true;
Ho capito, thanks.
Ne approfitto per approfondire la cosa con un'altra domanda. Se nella 
struct di prima avessi anche un campo di tipo puntatore a funzione...
typedef struct
{
    tipomio t;
    bool v;
    bool (*ptr_funz) ();
} elemento;
ovviamente da qualche parte avro' definito una serie di funzioni:
bool nomefunz1();
bool nomefunz2();
...
A questo punto faccio di nuovo:
std::vector<elemento> caratteristica;
Adesso la mia necessita' e' quella di inizializzare il campo puntatore a 
funzione e, in seguito, di lanciare la funzione stessa.
Per l'inizializzazione ipotizzo sia sufficiente scrivere...
caratteristica[indice].ptr_funz = nomefunz1;
Mentre per lanciare la funzione dovrei fare...
bool risu = caratteristica[indice]->ptr_funz();
Oppure no?
-- 
www.project-ring.com

 Oppure no?
No, perché caratteristica[indice] non è un puntatore.
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

  bool risu = (caratteristica[indice].ptr_funz)() ;
Capito. Quindi se al posto di vector avessi list, non potendo adoperare 
l'operatore [], dovrei definire un iterator, fargli scorrere la lista e 
lanciare la funzione puntata con l'operatore ->
-- 
www.project-ring.com

 lanciare la funzione puntata con l'operatore ->
Puoi farlo, sě, perchč gli iteratori, pur non essendo (necessariamente) dei
puntatori, dispongono di un operatore -> appositamente definito.
Nota che anziché usare l'operatore ->, con iteratori e puntatori, puoi
*sempre* dereferenziare con '*' e usare il '.':
   i->a  equivale a  (*i).a
Max

 struct di prima avessi anche un campo di tipo puntatore a funzione...
Ma sei proprio sicuro di dovere fare una cosa del genere?
Non ti basta usare delle funzioni direttamente definite nella classe?
-enrico
-- 
Never argue with a logician.