我建了一个ATL工程,新加了一个类Value2D,自动生成的结构是:IValue2D:public IDispatch;   CValue2D :public IValue2D
然后,我需要在CValue2D里实现operator+的重载,并且我以经实现了从IUnknown继承下来的三个纯虚函数,我的operator+的实现代码如下:CValue2D CValue2D::operator + (const CValue2D &V2D)
{//这里编译出错
return CValue2D(x + V2D.x, y + V2D.y);
}函数的调用方式都没有问题,都是STDMETHODIMP可是编译的时候却出错,说不能实例化一个抽象类的对象。我真的不明白,我以经把IUnknown的AddRef、Release、QueryInterface他仍然出错。IDispatch里面还有四个纯虚,可是我在CValue2D里声明都没有问题,在cpp里一实现它就说函数主体以存在,但我直接在类里实现却没问题,真的搞不懂!!!!!!!!!!!!!!!!!!!!!!有没有人救救我啊??????????????????????

解决方案 »

  1.   

    CSDN没有人会吗???求求诸位了,帮我UP一下吧!!!!!!!!!!!!!!
      

  2.   

    CValue2D& CValue2D::operator + (const CValue2D &V2D)
      

  3.   

    其实问题的关键是这一句CValue2D(x + V2D.x, y + V2D.y);它不让我构造啊!!!!!!!!!!!!!!!!!!!!!!!!!有没有大侠会??老板要我交差的!!!!!!!!!!!!!
      

  4.   

    ???
    用引用啊,不要传值返回.
    CValue2D& CValue2D::operator + (const CValue2D &V2D)
    {
       x+=V2D.x;
       y+=V2D.y;
       return *this;
    }
      

  5.   

    你还要实现IDispatch中的纯虚。
      

  6.   

    IDispatch里面还有四个纯虚,可是我在CValue2D里声明都没有问题,在cpp里一实现它就说函数主体以存在,但我直接在类里实现却没问题,真的搞不懂!!!!!!!!!!!!!!!!!!!!!!
      

  7.   

    ft!
    在你的class头文件开始处加:
    #ifdef _ATL_DEBUG
    #define END_COM_MAPEX() {NULL, 0, 0}}; return &_entries[1];} \
    virtual ULONG STDMETHODCALLTYPE AddRef( void) ; \
    virtual ULONG STDMETHODCALLTYPE Release( void) ; \
    STDMETHOD(QueryInterface)(REFIID, void**) ;
    #else
    #define END_COM_MAPEX() {NULL, 0, 0}}; return _entries;} \
    virtual ULONG STDMETHODCALLTYPE AddRef( void) ; \
    virtual ULONG STDMETHODCALLTYPE Release( void) ; \
    STDMETHOD(QueryInterface)(REFIID, void**) ;
    #endif // _ATL_DEBUG
    再把类声明中的:
    END_COM_MAP()改为END_COM_MAPEX()
    ok?
    BTW:不必定义IDispatch接口函数,IDispatchImpl已定义。
      

  8.   

    呵呵!设计本身就有问题!即使解决也不符合COM规范!
      

  9.   

    呵呵,这个问题是CValue2D类本身是个抽象类,当加上CComObject后才有被实例
    化的能力,(因为AddRef 等这时才被实现)而这是由OBJECT_ENTRY宏定义。具体细节可以看看Inside ATL
      

  10.   

    补充一句:如果你能看懂下面的代码(注意:new 部分),自然知道为什么了!template <class Base>
    HRESULT WINAPI CComObject<Base>::CreateInstance(CComObject<Base>** pp)
    {
    ATLASSERT(pp != NULL);
    HRESULT hRes = E_OUTOFMEMORY;
    CComObject<Base>* p = NULL; ATLTRY(p = new CComObject<Base>()) if (p != NULL)
    {
    p->SetVoid(NULL);
    p->InternalFinalConstructAddRef();
    hRes = p->FinalConstruct();
    p->InternalFinalConstructRelease();
    if (hRes != S_OK)
    {
    delete p;
    p = NULL;
    }
    }
    *pp = p;
    return hRes;
    }
      

  11.   

    To :paul2002() 你的东西的确对我帮助很大,但我的这个问题仍然没有解决,我回应的就在你楼上,没有看到吗??我的有分的贴子不下50个,从来没有不结过!!我的信誉分低是因为在水园骂共产党被封两次,我从来没有听说过有人因为不结贴而被扣信誉分!!!!!!!!!!你不就是想要分吗?你想要三颗星吗?我知道你爱国,因为那三颗星代表海、陆、空三军……(张小白)
    另,十分感谢sun_fire_fox() ,让我领悟一下……