2012-01-21 7 views
12

Eventuali duplicati:
g++ undefined reference to typeinfo
Undefined symbols “vtable for …” and “typeinfo for…”?undefined reference to `typeinfo per la classe

non posso usare la mia classe.

class Accel { 
public: 
    virtual void initialize(void); 
    virtual void measure(void); 
    virtual void calibrate(void); 
    virtual const int getFlightData(byte); 
}; 
class Accel_ad : public Accel { 
public: 
    Accel_ad() : Accel(){} 
    void initialize(void) {/*code code code...*/} 
    void measure(void) {/*measure code*/} 
    const int getFlightData(byte axis){/*getting data*/} 
    void calibrate(void) { 
     int findZero[FINDZERO]; 
     int dataAddress; 
     uint8_t data[2]; 
     for (byte calAxis = XAXIS; calAxis < ZAXIS; calAxis++) { 
      if (calAxis == YAXIS) dataAddress = 0x32; 
      if (calAxis == XAXIS) dataAddress = 0x34; 
      if (calAxis == ZAXIS) dataAddress = 0x36; 
      for (byte i=0; i<FINDZERO; i++) { 
       readReverseWordI2C(dataAddress,data); 
       findZero[i] = (data[1] << 8) | (data[0]);; 
       Delay_ms(10); 
      } 
      accelZero[calAxis] = findMedian(findZero, FINDZERO); 
     } 

     // replace with estimated Z axis 0g value 
     accelZero[ZAXIS] = (accelZero[XAXIS] + accelZero[PITCH])/2; 
     // store accel value that represents 1g 
     measure(); 
     accelOneG = -accelData[ZAXIS]; 
    } 

main.cpp

Accel_ad accel;//all ok 
accel.initialize();//all ok 
accel.calibrate();//ERROR: undefined reference to `typeinfo for Accel' 
accel.measure();//All okey 

che sanno cosa c'è che non va?

+1

Messaggio del * esattamente * errore di compilazione completa. – Nawaz

+0

[cc] .. \ obj \ main.o :(. Rodata._ZTI8Accel_ad [tipoinfo per Accel_ad] + 0x8): riferimento non definito a 'typeinfo per Accel ' [cc] collect2: ld restituito 1 stato di uscita – SevenDays

+0

@wsevendays: si prega di aggiornare la domanda con il messaggio di errore esatto. In generale, rispondi alle richieste di chiarimenti aggiornando il tuo post, piuttosto che rispondere con un commento. Per prima cosa, una domanda dovrebbe essere comprensibile senza leggere i commenti. Per un altro, SO è un QA e un sito, non un forum, e i commenti non sono destinati (né sono adatti) per le discussioni. – outis

risposta

40

È necessario fornire una definizione di funzioni virtuali nella classe di base o dichiarare puro:

class Accel { 
public: 
    virtual void initialize(void) = 0;  //either pure virtual 
    virtual void measure(void) = 0; 
    virtual void calibrate(void) {};   //or implementation 
    virtual const int getFlightData(byte) {}; 
}; 
+0

Ho trovato che se commento linea "measure();" compila il mio codice, ma perché non riesco a chiamare la funzione "measure();" dalla classe stessa? – SevenDays

+0

@wsevendays è il problema con la misura o la calibrazione? –

+0

Alla fine della funzione calibra, chiamo la funzione di misura, ma il mio codice non funziona. – SevenDays