类厂的问题,个人想法,虚心求教
#include <iostream.h>
#include <objbase.h>
class base
{
public:
virtual void queryinterface(int type,void **ptr)=0;
};
class a:public base
{
public:
virtual void printa()=0;
};
class b:public base
{
public:
virtual void printb()=0;
};
class c:public a,public b
{
public:
virtual void queryinterface(int type,void **ptr)
{
if (type==1) //BASE
{
cout<<"create BASE *"<<endl;
*ptr= static_cast<a*>(this);
}
else if(type==2) //base
{
cout<<"create a *"<<endl;
*ptr= static_cast<a*>(this);
}
else if(type==3)//b
{
cout<<"create b *"<<endl;
*ptr= static_cast<b*>(this);
}
else
{
cout<<"error"<<endl;
*ptr=NULL;
}
}
virtual void printa()
{
cout<<"printa"<<endl;
}
virtual void printb()
{
cout<<"printb"<<endl;
}
};
base * createobject()
{
a * c1=new c();
base *c2=(base *)c1;
return c2;
}
void main()
{
base *iukonws=createobject();
a *ia=NULL;
iukonws->queryinterface(2,(void**)&ia);
ia->printa();
b *ib=NULL;
ia->queryinterface(3,(void**)&ib);
ib->printb();
}
个人的想法,有错误请大家指出
///在实际使用中客户无法知道Createobject的实际转换过程,所以提出类厂的概念
在COM组件中可能有多个对象,每个对象对应一个类厂,考虑类厂代码的重用,编写一个通用的类厂代码,把不同的对象类信息放在一个数据结构中
在DLLGETCLASSOBJECT的函数实现中
HRESULT __stdcall DllGetClassObject(REFCLSID clsid, REFIID riid,
void** ppv)
{
cout << "Component: DllGetClassObject" << endl;
if(clsid != CLSID_Mathe)
return CLASS_E_CLASSNOTAVAILABLE;
CFactory* pFactory = new CFactory;
if(pFactory == NULL)
return E_OUTOFMEMORY;
***********// riid is probably IID_IClassFactory.
HRESULT hr = pFactory->QueryInterface(riid, ppv); //通过QueryInterface来产生具体对象类所对应的类厂指针,个人感觉和对象中的QueryInterface的实现方式类似,对象中返回的是接口指针,而DllGetClassObject中的ueryInterface返回的是对象对应的类厂指针。
pFactory->Release();
return hr;
}
然后通过过类厂指针去创建对应的对象指针,完成类似base * createobject()
的函数过程。再过对象类中的QueryInterface来完成接口指针的查找
呵呵,新手,如果错误的请详细指出,方便改正。