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

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


呵呵,新手,如果错误的请详细指出,方便改正。
...全文
92 1 点赞 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
kevinh 2007-09-26
也许对你用帮助.
http://www.cnblogs.com/webabcd/archive/2007/05/04/735934.html
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2007-09-26 11:39
社区公告
暂无公告