类厂的问题,个人想法,虚心求教

whowho 2007-09-26 12:00:29

#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来完成接口指针的查找


呵呵,新手,如果错误的请详细指出,方便改正。



...全文
69 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wshcdr 2007-09-27
  • 打赏
  • 举报
回复
UP
wishfly 2007-09-27
  • 打赏
  • 举报
回复
mark
zzh2106 2007-09-27
  • 打赏
  • 举报
回复
看的眼花缭乱!等高人来看

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧