我建了一个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里一实现它就说函数主体以存在,但我直接在类里实现却没问题,真的搞不懂!!!!!!!!!!!!!!!!!!!!!!有没有人救救我啊??????????????????????
然后,我需要在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里一实现它就说函数主体以存在,但我直接在类里实现却没问题,真的搞不懂!!!!!!!!!!!!!!!!!!!!!!有没有人救救我啊??????????????????????
用引用啊,不要传值返回.
CValue2D& CValue2D::operator + (const CValue2D &V2D)
{
x+=V2D.x;
y+=V2D.y;
return *this;
}
在你的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已定义。
化的能力,(因为AddRef 等这时才被实现)而这是由OBJECT_ENTRY宏定义。具体细节可以看看Inside ATL
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;
}
另,十分感谢sun_fire_fox() ,让我领悟一下……