这是什么C ++习语/模式

时间:2015-07-21 08:00:13

标签: c++ decorator idioms pimpl-idiom

我还是C ++ 11的新手。

前段时间我问过以下问题:
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 个答案:

答案 0 :(得分: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,但这不是实现它的方法。