首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >这是什么C++习惯用法/模式

这是什么C++习惯用法/模式
EN

Stack Overflow用户
提问于 2015-07-21 16:00:13
回答 1查看 258关注 0票数 0

我仍然是C++11的新手。

一段时间前,我问了以下问题:

Best method to implement an abstract factory pattern

为了更深入的研究,我想知道这个C++成语的名字是什么。

我在这里叫它pimpl,但我不确定这是不是正确的名称。

整个操作的目的是在从工厂返回Shape对象时隐藏原始指针或智能指针。使用这个“模式”工厂将能够返回一个相同的类型,并且特定的实现将被封装在对象中。

它也非常类似于decorator,除了它不装饰任何东西。

除了外部接口与“内部”接口相同之外,还可以发现与adapter的相似之处。

代码语言:javascript
复制
class PimplShape : public Shape{
    Shape *sh;
public:
    PimplShape(Shape *sh) : sh(sh){
    }

    virtual ~PimplShape() override{
        delete sh;
    }

    virtual void process() override {
        sh->process();
    }
};
EN

回答 1

Stack Overflow用户

发布于 2015-07-21 16:27:51

我个人的观点是,你在多个习语之间炮制了一些东西。

pimpl的思想是隐藏提供实际功能的内部类,以便您可以在不影响用户的情况下随心所欲地进行更改(Qt在这方面做得非常广泛)。如果我们看看你的代码,有两件事是禁止的-继承和方法在类定义中实现的事实(因此内部类的方法对类的用户是可见的)。在您的情况下,适当的pimpl应该是:

代码语言:javascript
复制
// 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,但这不是实现它的方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31533416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档