サーチ…


備考

(時には不透明ポインタまたはチェシャ猫の技術と呼ば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