Domanda

Sto scrivendo del codice in cui ho definito la seguente classe base.

class Chorus{
  public:

    //Destructor
    virtual ~Chorus();

    //callback function
    virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData );

    virtual void initializeDelayBuffer(void);

    virtual void destroyDelayBuffer(void);
};

Voglio usarlo come classe base e in realtà non farci nulla da solo.Quindi ho due classi separate che derivano da questa classe Chorus.Volevo farlo semplicemente per fornire alcuni vincoli di base su ciò che qualsiasi classe Chorus derivata DOVERE devono essere considerati utilizzabili nel mio programma.

Quando creo il mio progetto (Visual Studio 2008), ricevo errori di simboli esterni non risolti su tutte le funzioni virtuali di questa classe Chorus.Immagino che sia l'errore tipico in cui non ho effettuato dichiarazioni anticipate di queste funzioni.Ma, poiché sono virtuali e non voglio che vengano effettivamente definiti per fare qualcosa finché non vengono definiti all'interno delle classi derivate, cosa devo fare per risolvere questo problema?

È stato utile?

Soluzione

Se il tuo intento è che siano semplicemente dei segnaposto da implementare per le classi figlie, rendile pure funzioni virtuali terminando con = 0.Per esempio

virtual void destroyDelayBuffer(void) = 0;

Ciò rende il metodo, per così dire, "astratto".Il compilatore C++ non cercherà una definizione effettiva del metodo ma forzerà invece tutte le classi derivate a implementare questi metodi prima che possa essere creata un'istanza.

Altri suggerimenti

È necessario dichiarare tali funzioni come puramente virtuali.

virtual void inizializzaDelayBuffer(void) = 0;

Ciò creerà una sorta di interfaccia, che è ciò che desideri.

Questa è chiamata funzione virtuale pura.In C++ si scrive un "=0" dopo il nome della funzione, ma probabilmente vorrai leggere le FAQ su questi.

http://www.parashift.com/c++-faq-lite/abcs.html#faq-22.4

È necessario definire le funzioni come funzioni virtuali pure.Per fare ciò, aggiungi un " = 0" dopo ogni dichiarazione.Per esempio:

virtual void destroyDelayBuffer(void) = 0;

Utilizza una funzione virtuale pura:

  virtual int callback( void *outputBuffer, void *notUsed, unsigned int 
       nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData ) = 0;

Giusto per aggiungere alle risposte di cui sopra, non puoi istanziare un oggetto di una classe contenente funzioni virtuali pure, quindi in futuro se intendi avere oggetti della tua classe base, ricordati di rendere la funzione virtuale non pura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top