Pergunta

Estou a escrever algum código onde eu definida a seguinte classe de 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);
};

Eu quero usar isso como uma classe base e não realmente fazer alguma coisa com ele por conta própria. Então, eu tenho duas classes distintas que são derivados a partir desta classe Chorus. Eu queria fazer isso simplesmente fornecer algumas restrições básicas, como o que qualquer classe Chorus derivado deve tem que ser considerada utilizável no meu programa.

Quando eu construir meu projeto (Visual Studio 2008), eu recebo erros de símbolos externos não resolvidos sobre todas as funções virtuais a partir desta classe Chorus. Eu estou supondo que é o erro típico onde eu não fazer frente declarações destas funções. Mas, uma vez que eles são virtuais e eu não quero que eles realmente ser definido para fazer qualquer coisa até que sejam definidos dentro das classes decorrentes, o que eu faço para resolver este problema?

Foi útil?

Solução

Se a sua intenção é para que eles sejam simplesmente coloque suportes para classes filhas para implementar, em seguida, torná-los funções virtuais puras por terminando com = 0. Por exemplo

virtual void destroyDelayBuffer(void) = 0;

Isso faz com que o método "abstrato" por assim dizer. O compilador C ++ não vai olhar para uma definição real do método mas em vez irá forçar todas as classes derivadas para implementar esses métodos antes de uma instância pode ser criada.

Outras dicas

Você precisa declarar as funções como pura virtual.

virtual void initializeDelayBuffer (void) = 0;

Isso vai criar uma interface do tipo, que é o que você quer.

Isso é chamado de uma função virtual pura. Em C ++ você escreve um "= 0" após o nome da função, mas você provavelmente vai querer ler o FAQ sobre estes.

http://www.parashift.com/c++ -faq-lite / abcs.html # faq-22,4

Você precisa definir as funções como funções virtuais puros. Para fazer isso, adicione um "= 0" após cada declaração. Por exemplo:

virtual void destroyDelayBuffer(void) = 0;

Use uma função virtual pura:

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

Só para acrescentar às respostas acima, você não pode instanciar um objeto de uma classe que contém funções virtuais puras, assim, no futuro, se você pretende ter objetos de sua classe base, lembre-se de fazer o virtual função não-puro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top