2014-05-22 138 views
2

我有一个共享的基类CMyBase,它进一步分为CMyFirst和CMySecond的子类。我如何为客户实现一个工厂接口,以便他们不需要知道使用CComObjects创建了哪些子项?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; 
} 

我明白为什么会出现此错误,但我该如何做到这一点呢?

error C2664: 'ATL::CComObject<Base>::CreateInstance' : cannot convert parameter 1 from 'ATL::CComObject<Base> *' to 'ATL::CComObject<Base> **' 
+0

'CreateInstance'到适当的局部变量,然后返回指针之前铸造。 –

回答

1

先创建派生类,然后在返回之前将其转回基地。

一个例子:

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; 
}