C++初心者ですが, "Pimpl" っていうのが気になっています.
"Pimpl" というのは,例えば↓みたいなやつだと, XXX
を使う箇所に "YYY.h", "ZZZ.h" への依存関係が生じてしまい,それが嫌だから……
C++
1//[XXX.h] 2#include "YYY.h" 3#include "ZZZ.h" 4 5class XXX 6{ 7public: 8 void PublicMethod1(); 9 void PublicMethod2(); 10private; //こいつらのせいで依存関係が生まれる 11 YYY m_YYY; 12 ZZZ m_ZZZ; 13};
それを避けるために
C++
1//[XXX.h] Pimpl版 2class XXX 3{ /* ctor とか dtor のあたりは省略 */ 4public: 5 void PublicMethod1(); 6 void PublicMethod2(); 7private; //具体的な実装は Impl の中に書くことにして…… 8 class Impl; 9 std::unique_ptr< Impl > m_pImpl; 10};
とかしておいて,各 public メソッドは Impl
に処理を移譲する:
C++
1//[XXX.cpp] 2#include "XXX.h" 3#include "YYY.h" 4#include "ZZZ.h" 5 6//隠蔽された実装 7class XXX::Impl 8{ 9public: 10 void PublicMethod1(){ /*略*/ } 11 void PublicMethod2(){ /*略*/ } 12private; 13 YYY m_YYY; 14 ZZZ m_ZZZ; 15}; 16 17//処理を移譲 18void XXX::PublicMethod1(){ m_pImpl->PublicMethod1(); } 19void XXX::PublicMethod2(){ m_pImpl->PublicMethod2(); }
……っていう話だと思うんですが,
これって要は「 XXX
はpublicなインタフェースだけを決めていて,その具体実装は Impl
」ってことですよね.
であれば,以下のような形でもよい,というか素直な形(?)ではなかろうかと思うのですが,どうなんでしょう.
C++
1//[IXXX.h] 2 3//インタフェースを決めたいのなら 4//こうやってインタフェースを決めて…… 5class IXXX 6{ 7public: 8 virtual void PublicMethod1() = 0; 9 virtual void PublicMethod2() = 0; 10}; 11 12//あとは実装を得る手段を用意すればそれで済むのではなかろうか? 13std::unique_ptr< IXXX > CreateXXX();
C++
1//[XXX.cpp] 2#include "IXXX.h" 3#include "YYY.h" 4#include "ZZZ.h" 5 6namespace 7{//隠蔽された実装 8 class XXX : public IXXX 9 { 10 public: 11 virtual void PublicMethod1() override { /*略*/ } 12 virtual void PublicMethod2() override { /*略*/ } 13 private: 14 YYY m_YYY; 15 ZZZ m_ZZZ; 16 }; 17} 18 19std::unique_ptr< IXXX > CreateXXX(){ return std::make_unique<XXX>(); }
両者(他の形もあるかもですが)の{違い,使い分け/選択基準,etc...}というのはどんな感じなのでしょうか?
( Pimpl の側を{使うべき,使わなきゃならない,使ったほうが良い, etc... }場面とは?)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。