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

whowho 2007-09-26 11:39:28

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


呵呵,新手,如果错误的请详细指出,方便改正。
...全文
116 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2007-09-26
  • 打赏
  • 举报
回复
也许对你用帮助.
http://www.cnblogs.com/webabcd/archive/2007/05/04/735934.html

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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