Newsgroup: it.comp.lang.c++
Titolo: Errore: undefined vtable

Ciao,
sto cercando di portare un driver di un accelerometro (Adafruit 10DOF)
su una nuova piattaforma (FRDM_k64F).
Qui: 
https://github.com/adafruit/Adafruit_10DOF
 
e qui: 
https://github.com/adafruit/Adafruit_Sensor
 
c'e' il codice originale.
 
Il problema (oltre al fatto che non conosco bene il C++) sembra essere
nella definizione della classe in Adafruit_Sensor.h:
 
class Adafruit_Sensor {
 public:
  // Constructor(s)
 void constructor();
 
  // These must be defined by the subclass
  virtual void enableAutoRange(bool enabled) {};
  virtual void getEvent(sensors_event_t*);
  virtual void getSensor(sensor_t*);
 
 private:
  bool _autoRange;
};
 
alla compilazione mi da':
 
<path>/Adafruit/Adafruit_Sensor.h:139: undefined reference to `vtable
for Adafruit_Sensor'
 
il file cpp contiene solo 
#include "Adafruit_Sensor.h"
 
void Adafruit_Sensor::constructor() {
}
 
qualche idea?
 
Grazie Ciao Jack
-- 
Yoda of Borg am I! Assimilated shall you be! Futile resistance is, hmm?


Il messaggio non e' preciso in quanto non specifica il metodo (o i 
metodi) non definiti
Dovrai cercarli
Inoltre aggiungici virtual ~Adafruit_Sensor() (il distruttore virtuale)
E' un grave errore logico non metterlo, in quanto si potrebbero avere 
dei memory leak nella distruzione delle classi figlie che si spera ci 
siano altrimenti che senso avrebbe virtual ?
 


ok, roba fatta col culo.
vabbe' ci butto dentro ancora una mezz'ora, se non risolvo faccio prima
a riscrivere tutto in C.



Scusa, leggendo non ho notato che il file cpp a parte il metodo 
construct e' vuoto
Quindi il problema apparentemente e' facile, manca la definizione di 
getEvent e getSensor a meno che non siano in qualche altro file
 
Ma:
// These must be defined by the subclass
 
Dal commento  si puo trarre il significato che i metodi getEvent e 
GetSensor devono essere definiti nelle sottoclassi (le classi figlie) 
quindi saranno definiti li (si spera)
E non si capisce perche' non li abbia scritti cosi:
 
virtual void getEvent(sensors_event_t*)=0;
virtual void getSensor(sensor_t*)=0;
 
Se devono essere definiti nelle classe figlie mettici tranquillamente 
quello 0
oltre al distruttore virtuale
 
 
 
 
 


L' hai letto il secondo thread sempre mio ?
Comunque che sia scritto con i piedi non lo metto in dubbio neanche io
Tra l' altro leggendo pure:
 
   // Constructor(s)
 >>>    void constructor();
 
 
Questo non e'un costruttore,ma un normale metodo (poteva chiamarlo pippo 
ed era la stessa cosa)
 
 

 L' hai letto il secondo thread sempre mio ?
 
no, non l'avevo letto.


 oltre al distruttore virtuale
 
provero' grazie.



Ho letto qualche codice e quei metodi sono definiti nelle classi figlie
Quindi con le modifiche che farai dovrebbe andare bene
 

 ok, roba fatta col culo.
Sì, abbastanza...


    virtual void getSensor(sensor_t*) = 0;
 
mi compila e sembra funzionare, sembra nel senso che ora ho problemi col
driver del I2C, ma e' un'altra storia.
 
Grazie a tutti



...
 
Sono informazioni incomplete ed è molto difficile aiutarti.
Dovresti fornire dettagli sul resto del codice che stai
compilando e su come lo compili. Detto questo, un costruttore
ha il nome della stessa classe e non restituisce un tipo,
neanche void. La funzione "void constructor()" è un membro
public come altri.
 
 
-- 
Vincenzo Mercuri

 public come altri.
 
Alla fine, come si vede dagli altri messaggi ho risolto.
Le info che avevo ve le ho date (compresi link al codice che stavo
tentando di compilare) e sono comunque bastate ad enoquick per indicarmi
il motivo del problema ( e come risolverlo).



 
Per motivi a me sconosciuti mi ritrovo solo adesso l'intera
discussione. Per il codice originale, si è stata una mia svista,
mi sono soffermato sul nome "constructor()", che evidentemente
mi sembrava il problema principale. Pardon.
 
-- 
Vincenzo Mercuri