我还是 C++11 的新手。
前段时间我问了以下问题:
Best method to implement an abstract factory pattern
为了进一步研究,我想知道这个 C++ 习语的名称是什么。
我在这里称它为 pimpl
,但我不确定这是否是正确的名称。
整个事情的目的是在从工厂返回 Shape 对象时隐藏原始指针或智能指针。使用这个“模式”工厂将能够返回一个相同的类型,具体的实现将封装在对象内部。
它也非常类似于decorator
,只是它不装饰任何东西。
除了外部接口(interface)与“内部”接口(interface)相同外,您可能还会发现与 adapter
的相似之处。
class PimplShape : public Shape{
Shape *sh;
public:
PimplShape(Shape *sh) : sh(sh){
}
virtual ~PimplShape() override{
delete sh;
}
virtual void process() override {
sh->process();
}
};
最佳答案
我个人的看法是你在多个成语之间编造了一些东西。
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但这不是这样做的方法。
关于c++ - 这是什么 C++ 习语/模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31533416/