c++的习惯用法/模式是什么?

what C++ idiom / pattern is this

本文关键字:模式 是什么 惯用法 习惯 c++      更新时间:2023-10-16

我还是一个c++ 11新手。

前段时间我问了以下问题:
实现抽象工厂模式的最佳方法

为了进行更多的研究,我想知道这个c++习语的名字是什么。

这里我叫它pimpl,但我不确定这个名字是否正确。

整个事情的意图是隐藏原始或智能指针时,从工厂返回形状对象。使用这个"模式"工厂将能够返回一个相同的类型,并且特定的实现将被封装在对象中。

它与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();
    }
};

我个人认为你在多个习语之间编造了一些东西。

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,但这不是这样做的。