代码之家  ›  专栏  ›  技术社区  ›  Dai

为什么VC2008认为这个类是抽象的?

  •  1
  • Dai  · 技术社区  · 14 年前

    我正在编写一些代码来处理来自使用DirectShow的摄像头的视频输入,因此我必须实现IsampleGrabberCB。

    我的实现接口的类可以编译,但当我尝试实例化它时,编译器会引发“ error C2259: 'SampleGrabberCB' : cannot instantiate abstract class “。

    下面是我正在实现的接口:

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

    这是我的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
    };
    

    这是实现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;
    }
    

    以下是我如何使用它:

    SampleGrabberCB* callback = new SampleGrabberCB(device);
    

    有什么想法吗?谢谢!

    4 回复  |  直到 14 年前
        1
  •  6
  •   Will A    14 年前

    SampleCB 在接口中声明的没有第三个参数( bufferLen )存在于 SampleGrabberCB 班级。

        2
  •  2
  •   Starkey    14 年前

    您的samplecb方法与基(抽象)类中的方法不匹配。

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

    对战

    virtual STDMETHODIMP SampleCB( double SampleTime, IMediaSample *pSample ) = 0; 
    
        3
  •  1
  •   Stephen C. Steel    14 年前

    虚拟stdmethodimp samplecb(double sampletime,IMediasample*psample,long bufferlen)方法的签名与接口中纯虚拟方法的签名不匹配-需要删除bufferlen参数。

        4
  •  1
  •   Jim Ecker    14 年前

    看起来samplecb方法中的方法签名不同。在case上有2个参数和其他3个参数。