我还是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();
}
};
答案 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,但这不是实现它的方法。