c++的习惯用法/模式是什么?
what C++ idiom / pattern is this
我还是一个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,但这不是这样做的。
相关文章:
- libc++ 的 std::basic_string 的 16 字节对齐模式背后的原因是什么?
- Haskell中用多态性替换条件的等效模式是什么?
- 最简单的事件设计模式是什么
- 在发布模式下崩溃,但如果可调试为 true - 不是..什么是可能的问题
- 使用来自不同类的同名函数;这是什么模式
- 从C 中的函数中动态分配的缓冲区返回的最佳模式是什么?
- 解析 HTTP 的摘要式身份验证的正确正则表达式模式是什么?
- 打开文件的正确模式是什么,以便 seekp() 的工作方式与在默认模式下打开的文件相同
- 这种模式是什么意思?新建(&条目[num_entries])项目;
- 与保留模式GUI相比,使用直接模式GUI的性能含义是什么?
- 一般来说,使用Qt Creator,是什么导致程序在调试模式下编译时正确运行,但在发布模式下崩溃
- DNA模式匹配中最快的算法是什么
- 使用具有返回值的访客模式实现 AST 的最佳方法是什么?
- lock_guard始终拥有引用互斥锁的锁定模式是什么意思
- 一些数据库持久性设计模式是什么
- 这个设计模式是什么?如何使用它
- 使用"Memory Mapped Files"读取大XML数据的模式是什么?
- 使用asio::async_read的正确模式是什么?
- c++的习惯用法/模式是什么?
- 迭代地图和删除项目的最佳模式是什么?