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实现的)