pImpl イディオムのいくつかを読んでいるときに、次のようなものを見つけました。
MyClass::MyClass() : pimpl_( new MyClassImp() )
最初:それはどういう意味ですか?
2番目:構文は何ですか?
そんな初心者でごめんなさい。
pImpl イディオムのいくつかを読んでいるときに、次のようなものを見つけました。
MyClass::MyClass() : pimpl_( new MyClassImp() )
最初:それはどういう意味ですか?
2番目:構文は何ですか?
そんな初心者でごめんなさい。
これは のコンストラクタを定義しMyClass
ます。
構文は、初期化リストを使用したコンストラクター定義の構文です(これに続いて、コンストラクターの本体を定義する中括弧のセットがあると想定しています)。
のメンバpimpl_
はMyClass
、タイプ の新しいオブジェクトへのポインタとして初期化されていますMyClassImp
。以下とほぼ同じです。
MyClass::MyClass()
{
pimpl_ = new MyClassImp();
}
ただし、クラス メンバーの初期化には、可能な限り初期化リストを使用することをお勧めします。上記の C++ FAQ Lite エントリを参照してください。
初期化リストです。コンストラクター コードが呼び出される前に、メンバーと基本クラスのコンストラクターの値を設定できます。
これを使用して、クラス インスタンスの値を初期化する必要があります。
他の人がすでに説明したように、初期化子リストを持つコンストラクターであることに加えて、プライベート実装パターンも使用しています。
C++ では、クラス宣言にクラスのすべてのパブリック メンバーとプライベート メンバーを含める必要があります。これにより、望ましくない実装の詳細を公開する必要が生じ、実装が API/ABI の一部になる可能性があります。また、プライベート メンバー変数をサポートするためにパブリック ヘッダーに #include が追加されるため、コンパイル時間が大幅に長くなる可能性もあります。
実際の実装で 2 番目のクラスを作成し、関数 API を公開するだけで、これははるかにクリーンになりますが、間接的なレイヤーが追加されるという犠牲が伴います。
C は通常、ライブラリが作成および破棄する不透明なオブジェクトへのポインタを持つことでこれを処理します。