C++ C+的用途是什么+;类中包含一个;实施";及;接口“;指向自身的指针?

C++ C+的用途是什么+;类中包含一个;实施";及;接口“;指向自身的指针?,c++,design-patterns,class-design,C++,Design Patterns,Class Design,我正在研究一些源代码,我只是想知道为什么一个类(或多个类)经常以这种方式实现: class EventHandler { ... EventDispatcher* m_Dispatcher; virtual bool ProcEvent( EventHandler* Sender, int Task, int Event, void* Param ); ... }; class ClassA: public EventHandler { ... ClassA* m_I

我正在研究一些源代码,我只是想知道为什么一个类(或多个类)经常以这种方式实现:


class EventHandler
{
...
    EventDispatcher* m_Dispatcher;
    virtual bool ProcEvent( EventHandler* Sender, int Task, int Event, void* Param );
...
};

class ClassA: public EventHandler
{
...
    ClassA* m_Impl;
    ClassA* m_Iface;
...
public:
    // virtual functions
    virtual bool ProcEvent( EventHandler* Sender, int Task, int Event, void* Param );
    virtual void OnDataWritten(const PIOResult&) {;}
    ...

    // sample functions
    void SetImplement( ClassA* aImpl );
    void SetInterface( ClassA* aIface );
    ClassA* GetImplement() { return m_Impl; }
    ClassA* GetInterface() { return m_Iface; }
    bool GetData( list& aList );
};

// Implementation of some sample functions; Most of its function contain more
// or less the same format as below, with the return m_Impl->XXX having the same
// name as the function being defined (e.g. A::XXX)
bool ClassA::GetData( list< Data >& aList )
{
    if( m_Impl )
        return m_Impl->GetData( aList );
    else
        return false;
}

class ClassAFactory: public EventHandler
{
private:
    ClassAFactory* m_Impl;
    ClassAFactory* m_Iface;

protected:
    virtual ClassA* MakeTransport();

    virtual bool ProcEvent( EventHandler* Sender, int Task, int Event, void* Param );
    virtual ClassA* CreateClassA() { return 0; }

...
};

// In some member function of ClassB (ClassB inherits ClassA)

switch( status )
{
    case 1:
        GetInterface()->OnDataWritten();
    case 2:
        // ...
};


我相信这是为一些设计模式,但我不熟悉它。如果我知道它是什么,它可以帮助我理解。有没有人能帮我指出它可能是什么,或者这些类的用途是什么,以至于它是以这种方式实现的


我想它是用于一些事件处理,并与一些工厂一起使用,但我不确定。

我猜,但它可能是您正在寻找的“pimpl成语”吗

编辑
带有GetData实现的扩展代码示例绝对是pimpl习惯用法的一个示例。但是,这并不能解释
m\u Iface
成员。你能提供一个例子说明在哪里也使用了它吗

编辑2

随着m_Iface如何显示的示例的增加,很明显我在pimpl方面是错的。这是一种装饰。m_Impl指向底层对象,而m_Iface指向最外层,因此底层对象可以通过整个装饰器链进行调用。这个例子有点复杂,因为ClassA既是接口类又是默认实现。如果你想为类创建一个装饰器,你必须继承ClassA。

我猜想,但这可能是你正在寻找的“pimpl习惯用法”吗

编辑
带有GetData实现的扩展代码示例绝对是pimpl习惯用法的一个示例。但是,这并不能解释
m\u Iface
成员。你能提供一个例子说明在哪里也使用了它吗

编辑2

随着m_Iface如何显示的示例的增加,很明显我在pimpl方面是错的。这是一种装饰。m_Impl指向底层对象,而m_Iface指向最外层,因此底层对象可以通过整个装饰器链进行调用。这个例子有点复杂,因为ClassA既是接口类又是默认实现。如果你想创建类的装饰器,你必须继承C++类。

,这看起来比C ++多很多。在任何面向对象的语言中,都会使用继承和虚拟函数来实现这种行为


使用一个指向实现类的内部指针是非常好的(pimpl习惯用法),但是调用方通常无法访问该指针。而且我根本没有得到接口指针。

这看起来比C++更大的C。在任何面向对象的语言中,都会使用继承和虚拟函数来实现这种行为


使用一个指向实现类的内部指针是非常好的(pimpl习惯用法),但是调用方通常无法访问该指针。而且我一点也没有得到接口指针。

我担心使用的名称没有通常的
含义,因此如果没有输入内容或如何使用它们的示例,就很难猜测

您应该检查两种设计模式,它们大量使用这种
自递归
(在类级别*):

我担心你看到的东西无法模仿其中任何一个

装饰器中,重点是添加功能。为此,您有一个
接口
,其中派生了一个
具体的
类和一个
包装器
接口。然后,各种包装将派生出
包装
,您可以链接它们:

Interface* interface = new Wrapper2( new Wrapper1 ( new Concrete() ) );
每个包装都添加了一些功能,而这里我们只有完美的转发。。。所以它不是一个装饰者

组合
模式不同。它的目标是隐藏处理元素的集合还是单个元素。通常的例子是一棵树:您可以将操作应用于整个子树,也可以仅应用于叶节点(如果它是用
复合模式实现的)

再说一次,这里没有这样的事情

因此,我最好的猜测是,您要么有一个疯狂的设计(可能是一个错误的尝试来模拟一个众所周知的模式),要么您没有为我们提供足够的信息(源代码)来确定角色。不管怎么说,这似乎很奇怪


*注:类级别的
自递归
是指类
A
的对象指向类
A
的另一个对象,但这并不意味着(当然)它指向同一个实例。。。否则我们将出现堆栈溢出(双关语)。在
SetImplementation
调用过程中,这个不相同的实例位当然值得检查:注意,任何循环引用都会导致递归死亡。

我担心使用的名称没有
通常的
含义,因此如果没有放入内容或如何使用它们的示例,很难猜测

您应该检查两种设计模式,它们大量使用这种
自递归
(在类级别*):

我担心你看到的东西无法模仿其中任何一个

装饰器中,重点是添加功能。为此,您有一个
接口
,其中派生了一个
具体的
类和一个
包装器
接口。然后,各种包装将派生出
包装
,您可以链接它们:

Interface* interface = new Wrapper2( new Wrapper1 ( new Concrete() ) );
每个包装都添加了一些功能,而这里我们只有完美的转发。。。所以它不是一个装饰者

组合
模式不同。它的目标是隐藏处理元素的集合还是单个元素。通常的例子是一棵树:您可以将操作应用于整个子树,也可以仅应用于叶节点(如果它是用
复合
P实现的)