私はPImplをかなり広範囲に使用しており、自分が困惑していることに気付いたのは、Pimpl構造体のメンバーを正確に初期化する場所です。オプションは、Private
構造体のコンストラクターを作成してそこで初期化するか、メインクラスのコンストラクターで初期化することです。
myclass.hpp:
class MyClass {
public:
MyClass();
~MyClass();
private:
struct Private; unique_ptr<Private> p;
};
myclass.cpp:
#include "myclass.hpp"
#include <string>
struct MyClass::Private {
int some_var;
std::string a_string;
// Option A
Private() :
some_var {42},
a_string {"foo"}
{}
};
MyClass::MyClass() : p(new MyClass::Private) {
// Option B
p->some_var = 42;
p->a_string = "foo";
}
Private
現時点では、何らかの理由で新しいオブジェクトを作成したり、それらをコピーしたりする場合を除いて、2つの違いはあまりわかりません。その場合は、オプションAの方が適している可能性があります。また、初期化リスト内の変数を初期化することもできます。しかし、オプションBの方が読みやすく、おそらく保守しやすい傾向があることがわかりました。スケールをどちらかの方向に傾ける可能性のあるものがここにありますか?