C++ 带有ccombojects的工厂模式
我有一个共享基类CMyBase,它被进一步划分为子类CMyFirst和CMySecond。我如何为客户机实现工厂接口,以便他们不需要知道哪些子项是使用CComObjects创建的 基本上我想做的是:C++ 带有ccombojects的工厂模式,c++,com,atl,factory-pattern,C++,Com,Atl,Factory Pattern,我有一个共享基类CMyBase,它被进一步划分为子类CMyFirst和CMySecond。我如何为客户机实现工厂接口,以便他们不需要知道哪些子项是使用CComObjects创建的 基本上我想做的是: CMyBase* CFactory::Create { CMyBase* pInst = NULL; if (something) { pInst = new CMyFirst(); } else { pInst = n
CMyBase* CFactory::Create
{
CMyBase* pInst = NULL;
if (something)
{
pInst = new CMyFirst();
}
else
{
pInst = new CMySecond();
}
return pInst;
}
但如何创建子COM对象的实例
CComObject<CMyBase>* CFactory::Create
{
HRESULT hr = E_FAIL;
CComObject<CMyBase>* pInst = NULL;
if (something)
{
hr = CComObject<CMyFirst>::CreateInstance(&pInst); // compiler error (see below)
}
else
{
hr = CComObject<CMySecond>::CreateInstance(&pInst); // compiler error (see below)
}
if (SUCCEEDED(hr))
{
pInst->AddRef();
}
return pInst;
}
ccombject*CFactory::Create
{
HRESULT hr=E_失败;
ccombject*pInst=NULL;
如果(某物)
{
hr=ccombject::CreateInstance(&pInst);//编译器错误(见下文)
}
其他的
{
hr=ccombject::CreateInstance(&pInst);//编译器错误(见下文)
}
如果(成功(hr))
{
pInst->AddRef();
}
返回品斯特;
}
我明白我为什么会犯这个错误,但我怎么能不这样做呢
error C2664: 'ATL::CComObject<Base>::CreateInstance' : cannot convert parameter 1 from 'ATL::CComObject<Base> *' to 'ATL::CComObject<Base> **'
错误C2664:'ATL::CComObject::CreateInstance':无法将参数1从'ATL::CComObject*'转换为'ATL::CComObject**'
首先创建派生类,然后在返回之前将其强制转换回基类
一个例子:
CComObject<CMyBase>* CFactory::Create
{
HRESULT hr = E_FAIL;
CComObject<CMyBase>* pInst = NULL;
if (something)
{
CComObject<CMyFirst>* pFirst = NULL;
hr = CComObject<CMyFirst>::CreateInstance(&pFirst);
pInst = (CComObject<CMyBase>*)pFirst;
}
else
{
CComObject<CMySecond>* pSecond = NULL;
hr = CComObject<CMySecond>::CreateInstance(&pSecond);
pInst = (CComObject<CMyBase>*)pSecond;
}
if (SUCCEEDED(hr))
{
pInst->AddRef();
}
return pInst;
}
ccombject*CFactory::Create
{
HRESULT hr=E_失败;
ccombject*pInst=NULL;
如果(某物)
{
ccombject*pFirst=NULL;
hr=ccombject::CreateInstance(&pFirst);
pInst=(CCombject*)pFirst;
}
其他的
{
CComObject*pssecond=NULL;
hr=ccombject::CreateInstance(&psSecond);
pInst=(ccombject*)秒;
}
如果(成功(hr))
{
pInst->AddRef();
}
返回品斯特;
}
CreateInstance
到适当的局部变量,然后在返回指针之前强制转换。