Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Templates ATL COM-如何为接口方法重用代码_Templates_Visual C++_Inheritance_Com_Atl - Fatal编程技术网

Templates ATL COM-如何为接口方法重用代码

Templates ATL COM-如何为接口方法重用代码,templates,visual-c++,inheritance,com,atl,Templates,Visual C++,Inheritance,Com,Atl,我有几个接口,例如IA、IB、IC等,它们共享公共属性,例如站点。我想知道如何重用这些接口的代码,请将答案保存在COM聚合上 目前的执行情况如下: class CA // ATL specific... { STDMETHODIMP get_Site(...) {...} STDMETHODIMP put_Site(...) {...} } class BA // ATL specific... { STDMETHODIMP get_Site(...) {...}

我有几个接口,例如IA、IB、IC等,它们共享公共属性,例如站点。我想知道如何重用这些接口的代码,请将答案保存在COM聚合上

目前的执行情况如下:

class CA
// ATL specific...
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}

class BA
// ATL specific...
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}

class CC
// ATL specific...
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}
我想实现但无法实现的是如下

template<typename T>
class SharedProperties
{
    STDMETHODIMP get_Site(...) {...}
    STDMETHODIMP put_Site(...) {...}
}

class CA :
// ATL specific...
SharedProperties<CA>
{
    // properties are inherited and are accessible from IC
}

class BA
// ATL specific...
SharedProperties<CB>
{
    // properties are inherited and are accessible from IB
}

class CC
// ATL specific...
SharedProperties<CC>
{
// properties are inherited and are accessible from IA
}
我在阅读后发现了这个想法,但是这个网站没有一个有效的例子,无论我怎么努力,我都无法让它工作。我无法实例化抽象类,因为纯虚拟函数get\u Site和put\u Site没有按照第二个代码段实现

编辑 请注意,我使用的是VS2010。示例实现如下:

class ATL_NO_VTABLE CArticle :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CArticle, &CLSID_Article>,
    public IDispatchImpl<IArticle, &IID_IArticle, &LIBID_GeodeEdiLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
    CArticle()
    {
    }

编译器不知道方法get_Site和put_Site是否从接口实现这些方法。您需要从相应的接口继承SharedProperties类模板。这就是让SharedProperties成为模板的理由

interface IA
{
    STDMETHOD(get_Site)() = 0;
    STDMETHOD(put_Site)() = 0;
};

template<typename T>
class Sharedproperties : T
{
public:
    STDMETHODIMP get_Site() { return E_NOTIMPL; };
    STDMETHODIMP put_Site() { return E_NOTIMPL; };
};

class CAX : public IA
{
    STDMETHOD(other)() { return S_OK; }
}

class CA: public Sharedproperties<CAX>
{
public:
    CA() {}
};

哪个类是抽象的,不能实例化?SharedProperties::get\u Site和SharedProperties::put\u Site不应该是虚拟的吗?它们是虚拟的,但如果你熟悉ATL,我相信你会明白这一点。该代码段不是实际的源代码。它只是为了说明的目的,没有办法,你需要定义一个所有这些类都实现的IShared接口。缺点是客户机代码必须对其进行QI,就像聚合一样。您必须在每个中编写Site方法,您可以委托给公共实现。您已经在继承层次结构中放置了一个中间类。这是一个简洁的解决方案,但在ATL上下文中不起作用,因为类CA不直接从IA继承。在这种情况下,类模板必须从中间类继承。我已经编辑了示例代码来说明这个案例。这很奇怪,但您的解决方案确实有意义。有关VS2010生成的代码,请参阅我编辑的文章。
class ATL_NO_VTABLE CMyObject :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CMyObject, &CLSID_MyObject>,
    IMyObject
class ATL_NO_VTABLE CMyObject :
    public CComObjectRootEx<CComMultiThreadModel>,
    public CComCoClass<CMyObject, &CLSID_MyObject>,
    public Sharedproperties<MyIntermediateClass>