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

标签 c++ decorator idioms pimpl-idiom

我还是 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/

相关文章:

python - 如何装饰类或静态方法

python 包装器函数在装饰器中接受参数

arrays - 传递 `OsStr` 数组的惯用方法

c++ - 使用 CreateProcessAsUser 函数从提升的进程创建非提升的进程

python - 带函数注解的装饰器

c++ - 为动态二维数组创建正确的复制构造函数

python - 在Python中创建同级文件名

methods - 获取 Pharo 中所有已安装方法的正确方法

c++ - 具有 C++ 虚函数时的 GDB 不完整类型

c++ - 在 Windows 上构建 GnuMP 库 dll 的过程