C++
Pimpl Idiom
サーチ…
備考
(時には不透明ポインタまたはチェシャ猫の技術と呼ばementationをIMPLするためのp ointer)PIMPLイディオムは 、.cppファイルで定義された構造体に、すべてのプライベートデータメンバを移動させることによって、クラスのコンパイル時間を減少させます。
クラスは実装へのポインタを所有しています。このようにして、ヘッダーファイルはprivateメンバー変数で使用されるクラスを#include
する必要がないように、前方宣言することができます。
pimplイディオムを使用する場合、プライベートデータメンバーを変更する場合、それに依存するクラスを再コンパイルする必要はありません。
基本的なPimplイディオム
C ++ 11
ヘッダファイル:
// widget.h
#include <memory> // std::unique_ptr
#include <experimental/propagate_const>
class Widget
{
public:
Widget();
~Widget();
void DoSomething();
private:
// the pImpl idiom is named after the typical variable name used
// ie, pImpl:
struct Impl; // forward declaration
std::experimental::propagate_const<std::unique_ptr< Impl >> pImpl; // ptr to actual implementation
};
実装ファイル:
// widget.cpp
#include "widget.h"
#include "reallycomplextype.h" // no need to include this header inside widget.h
struct Widget::Impl
{
// the attributes needed from Widget go here
ReallyComplexType rct;
};
Widget::Widget() :
pImpl(std::make_unique<Impl>())
{}
Widget::~Widget() = default;
void Widget::DoSomething()
{
// do the stuff here with pImpl
}
pImpl
は、 Widget
状態(またはそのほとんどまたはほとんど)が含まれています。ヘッダーファイルで公開されている状態のWidget
説明の代わりに、実装内でしか公開できません。
pImpl
は「実装へのポインタ」の略です。 Widget
の「本当の」実装はpImpl
ます。
危険:これがunique_ptr
で動作するためには、 Impl
が完全に見えるファイル内のある場所にImpl
~Widget()
実装しなければならないことに注意してください。そこに=default
することはでき=default
が、 Impl
が定義されていない場合は=default
になり、プログラムは簡単に不正な形式になり、診断は必要ありません。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow