2015-07-21 42 views
0

我对C++ 11还是个新手。什么C++习语/模式是这样的

前段时间我问以下问题:
Best method to implement an abstract factory pattern

为了研究更多一些,我想知道这是什么C++成语的名称。

这里我称它为pimpl,但我不确定这是否是正确的名称。

整个事情的目的是在从工厂返回Shape对象时隐藏原始指针或智能指针。使用这个“模式”工厂将能够返回一个和相同的类型,具体的实现将被封装在对象内部。

它也非常类似于decorator,除非它不装饰任何东西。

除了外部接口与“内部”接口相同之外,人们也可以发现类似于adapter

class PimplShape : public Shape{ 
    Shape *sh; 
public: 
    PimplShape(Shape *sh) : sh(sh){ 
    } 

    virtual ~PimplShape() override{ 
     delete sh; 
    } 

    virtual void process() override { 
     sh->process(); 
    } 
}; 
+1

“从工厂返回Shape对象时”这是如何完成的?您没有方法返回包含的Shape。而且,这将创建一个完整的Shape,它本身必须包含指向另一个Shape的指针。我不确定那是你想要的,是吗?似乎对我来说是多余的。 –

+0

http://stackoverflow.com/questions/31494734/best-method-to-implement-an-abstract-factory-pattern - 检查这一点。如果使用这种方式,工厂将始终返回一个和相同的类型。具体的实现将被封装在这种类型中。 – Nick

+4

你的班级做的那个unique_ptr不是什么? – Pumkko

回答

1

我个人认为你已经在多种成语之间做了一些东西。

pimpl的想法是隐藏提供实际功能的内部类,以便您可以根据需要更改而不会影响用户(Qt广泛地这么做)。如果我们看看你的代码,有两件事情比禁止它 - 继承和方法在类定义中实现的事实(所以内部类的方法对类的用户是可见的)。在你区分正确的pimpl是:

// PimplShape.h 
class Shape; 

class PimplShape 
{ 
    Shape *sh_; 
public: 
    PimplShape(Shape *sh); 
    ~PimplShape(); 
    void process(); 
}; 

// PimplShape.cpp 
#include "Shape.h" // Defines Shape::process() so PimplShape can use it 

PimplShape::PimplShape(Shape *sh) : sh_(sh) 
{ 

} 

PimplShape::~PimplShape() 
{ 
    delete sh_; 
} 

void PimplShape::process() 
{ 
    sh_->process(); 
} 

正如你可以在这里看到,该Shape类是从PimplShape.h文件的任何用户隐藏。

如果我们从功能的角度来看你的例子,似乎你想实现CRTP,但这不是做到这一点的方法。

+0

我不认为这是典型的Pimpl模式的“impl”是一个抽象类(我从Nick的另一个问题的背景知道'Shape'是一个抽象类)。你通常不需要隐藏抽象类。 –

+0

@ChrisDrew这只是为了说明'pimpl'看起来像给定的代码示例,这样Nick就可以看到区别:)正如我所说的,他似乎是在许多成语之间存在的东西,所以应该有一些澄清至于他试图达到的目标是什么。 –