C++ 带有ccombojects的工厂模式

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,它被进一步划分为子类CMyFirst和CMySecond。我如何为客户机实现工厂接口,以便他们不需要知道哪些子项是使用CComObjects创建的

基本上我想做的是:

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
到适当的局部变量,然后在返回指针之前强制转换。