Вопрос

Я пишу некоторый код, в котором я определил следующий базовый класс.

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

Я хочу использовать это как базовый класс и на самом деле ничего не делать с ним самостоятельно.Итак, у меня есть два отдельных класса, которые являются производными от этого класса Chorus .Я хотел сделать это, чтобы просто предоставить некоторые базовые ограничения относительно того, какой любой производный класс Chorus ДОЛЖЕН должны считаться пригодными для использования в моей программе.

Когда я создаю свой проект (Visual Studio 2008), я получаю неразрешенные ошибки внешних символов во всех виртуальных функциях из этого класса Chorus.Я предполагаю, что это типичная ошибка, из-за которой я не делал прямых объявлений этих функций.Но, поскольку они виртуальные, и я не хочу, чтобы они действительно были определены для каких-либо действий, пока они не будут определены в производных классах, что мне делать, чтобы решить эту проблему?

Это было полезно?

Решение

Если вы хотите, чтобы они были просто заполнителями для реализации дочерних классов, то сделайте их чисто виртуальными функциями, оканчивающимися на = 0.Например

virtual void destroyDelayBuffer(void) = 0;

Это делает метод, так сказать, "абстрактным".Компилятор C ++ не будет искать фактическое определение метода, но вместо этого заставит все производные классы реализовать эти методы перед созданием экземпляра.

Другие советы

Вам нужно объявить эти функции как чисто виртуальные.

виртуальная пустота initializeDelayBuffer(void) = 0;

Это создаст своего рода интерфейс, который является тем, что вы хотите.

Это называется чисто виртуальной функцией.В C ++ вы пишете "= 0" после имени функции, но вы, вероятно, захотите прочитать FAQ по этим функциям.

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

Вам нужно определить функции как чисто виртуальные функции.Чтобы сделать это, добавляйте "= 0" после каждого объявления.Например:

virtual void destroyDelayBuffer(void) = 0;

Используйте чисто виртуальную функцию:

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

Просто чтобы добавить к приведенным выше ответам, вы не можете создать экземпляр объекта класса, содержащего чисто виртуальные функции, поэтому в будущем, если вы собираетесь иметь объекты вашего базового класса, не забудьте сделать функцию не чисто виртуальной.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top