Frage

Ich schreibe einige Code, wo ich die folgende Basisklasse definiert.

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);
};

Das mag ich als Basisklasse verwenden, und nicht wirklich etwas zu tun mit ihm auf seinem eigenen. So habe ich zwei getrennte Klassen, die von dieser Klasse Chorus abgeleitet ist. Ich wollte, dies zu tun, um einfach einige grundlegende Einschränkungen zu geben, was Derived Chorus Klasse muss haben in meinem Programm verwendbar betrachtet werden.

Wenn ich mein Projekt (Visual Studio 2008) bauen, bekomme ich nicht aufgelösten externes Symbol Fehler auf allen virtuellen Funktionen aus dieser Chorus-Klasse. Ich vermute, es ist der typische Fehler, wo ich nicht Erklärungen dieser Funktionen machen nach vorn hat. Aber, da sie virtuell sind, und ich will sie nicht wirklich definiert werden, etwas zu tun, bis sie innerhalb der Ableitung Klassen definiert werden, was muss ich tun, um dieses Problem zu lösen?

War es hilfreich?

Lösung

Wenn Ihre Absicht ist es für sie einfach Halterungen für Kinderklassen platzieren zu implementieren, sie dann rein virtuelle Funktionen machen, indem sie mit = 0. Zum Beispiel endet

virtual void destroyDelayBuffer(void) = 0;

Das macht die Methode „abstrakt“ sozusagen. Die C ++ Compiler wird nicht für eine tatsächliche Definition des Verfahrens aus, sondern stattdessen werden alle abgeleiteten Klassen zwingen, diese Methoden zu implementieren, bevor eine Instanz erstellt werden kann.

Andere Tipps

Sie müssen diese Funktion als rein virtuell erklären.

virtual void initializeDelayBuffer (void) = 0;

Das wird eine Schnittstelle der Art schaffen, das ist, was Sie wollen.

Dies ist eine rein virtuelle Funktion aufgerufen. In C ++ schreiben Sie einen „= 0“ nach dem Funktionsnamen, aber Sie wollen wahrscheinlich die häufig gestellten Fragen auf diese lesen.

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

Sie müssen die Funktionen als reine virtuelle Funktionen definieren. Um dies zu tun, fügen Sie nach jeder Erklärung eines „= 0“. Zum Beispiel:

virtual void destroyDelayBuffer(void) = 0;

Verwenden Sie eine rein virtuelle Funktion:

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

Just zu den oben genannten Antworten auf hinzufügen, können Sie nicht ein Objekt einer Klasse mit reinen virtuellen Funktionen, so auch in Zukunft instanziiert, wenn Sie Objekte Ihrer Basisklasse haben mögen, denken Sie daran, die Funktion nicht rein virtuell zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top