2010-08-30 15 views
1

J'écris du code pour gérer l'entrée vidéo de certaines caméras en utilisant DirectShow, donc je dois implémenter ISampleGrabberCB.Pourquoi VC2008 pense que cette classe est abstraite?

Ma classe qui implémente l'interface se compile bien, mais lorsque j'essaie de l'instancier, le compilateur lève "error C2259: 'SampleGrabberCB' : cannot instantiate abstract class".

Voici l'interface que je suis mise en œuvre:

interface ISampleGrabberCB : public IUnknown { 
    virtual STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample) = 0; 
    virtual STDMETHODIMP BufferCB(double SampleTime, BYTE *pBuffer, long BufferLen) = 0; 
}; 

Voici ma tête de SampleGrabberCB:

#pragma once 

#include "stdafx.h" 

class SampleGrabberCB : public ISampleGrabberCB { 
private: 

    int     _refCount; 
    DShowCaptureDevice* _parent; 

public: 
// SampleGrabberCB(); 
    SampleGrabberCB(DShowCaptureDevice* parent); 
    ~SampleGrabberCB(); 

    virtual STDMETHODIMP BufferCB(double sampleTime, BYTE* pBuffer, long bufferLen); 
    virtual STDMETHODIMP SampleCB(double sampleTime, IMediaSample * pSample, long bufferLen); 

#pragma region IUnknown 

    virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppv) { 

     if(riid == IID_ISampleGrabberCB || riid == IID_IUnknown) { 

      *ppv = (void *) static_cast<ISampleGrabberCB*> (this); 
      return NOERROR; 
     } 

     return E_NOINTERFACE; 

    } 

    virtual ULONG STDMETHODCALLTYPE AddRef() { 
     return ++_refCount; 
    } 

    virtual ULONG STDMETHODCALLTYPE Release() { 
     int n = --_refCount; 
     if (n &lt;= 0) { 
      delete this; 
     } 
     return n; 
    } 

#pragma endregion 
}; 

et c'est la mise en œuvre SampleGrabberCB.cpp:

#include "StdAfx.h" 
#include "SampleGrabberCB.h" 

//SampleGrabberCB::SampleGrabberCB() { 
// _parent = NULL; 
//} 

SampleGrabberCB::SampleGrabberCB(DShowCaptureDevice* parent) { 

    _parent = parent; 
} 

SampleGrabberCB::~SampleGrabberCB() { 
} 

STDMETHODIMP SampleGrabberCB::BufferCB(double sampleTime, BYTE *pBuffer, long bufferLen) { 
    // dummy value for now 
    return -50; 
} 

STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen) { 
    // dummy value for now 
    return 100; 
} 

ici est comment je l'utilise:

SampleGrabberCB* callback = new SampleGrabberCB(device); 

Des idées? Merci!

+5

Le compilateur vous indiquera généralement ce qui manque dans le reste du message d'erreur. –

+0

Le compilateur n'a pas, cependant. C'est le seul message d'erreur qu'il a donné, et comme je l'ai dit, ma classe compile bien. – Dai

Répondre

6

SampleCB comme déclaré dans l'interface n'a pas le troisième paramètre (bufferLen) qui est présent dans la classe SampleGrabberCB.

+0

* headdesk * Merci! Je suis fâché que l'EDI n'ait pas listé les méthodes qui ne correspondaient pas à l'interface (comme c'est le cas pour C# ou Java). Est-il possible d'activer ceci, ou est-ce inhérent à la complexité du compilateur de C++? – Dai

+0

Pas de problème. Je ne suis pas un développeur C++ (enfin, je n'ai pas utilisé VC++ depuis plus de sept ans), donc je crains de ne pouvoir commenter cette information - quelqu'un d'autre pourrait bien vous le dire - je le ferais J'ai certainement pensé que ce serait outputtable. –

2

Votre méthode SampleCB ne correspond pas à la méthode de la classe de base (abstraite).

STDMETHODIMP SampleGrabberCB::SampleCB(double sampleTime, IMediaSample *pSample, long bufferLen) 

contre

virtual STDMETHODIMP SampleCB(double SampleTime, IMediaSample *pSample) = 0; 
1

La signature de votre méthode virtuelle STDMETHODIMP SampleCB (Double SampleTime, IMediaSample * Psample, longue bufferLen) ne matcht pas celle du Mether virtuel pur dans l'interface - vous avez besoin pour supprimer l'argument bufferlen.

1

Il semble que la signature de méthode soit différente dans la méthode SampleCB. Sur cas a 2 paramètres et les 3 autres paramètres.