gpt4 book ai didi

c++ - 使用 CComObjects 的工厂模式

转载 作者:太空狗 更新时间:2023-10-29 21:43:03 25 4
gpt4 key购买 nike

我有一个共享基类 CMyBase,它进一步分为子类 CMyFirst 和 CMySecond。我如何为客户实现一个工厂接口(interface),这样他们就不需要知道哪个 child 是使用 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> **'

最佳答案

先创建派生类,然后在返回前将其强制转换回基类。

一个例子:

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

关于c++ - 使用 CComObjects 的工厂模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23803834/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com