2014-05-22 50 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; 
}