私はPImplをかなり使い慣れています。私が自分自身で見つけたものは、正確にPimplの構造体のメンバーを初期化する場所です。オプションは、Private
構造体のコンストラクタを作成して初期化したり、メインクラスのコンストラクタで初期化したりすることです。pimplクラスのデフォルト値を初期化するのに最適な場所は?
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
オブジェクトを作成したい場合や、オブジェクトをコピーしたい場合は、オプションAが望ましい場合があります。また、初期化リスト内の変数を初期化することもできます。しかし、私はオプションBがより読みやすく、保守性が高い傾向にあることがわかりました。ここには何かがあるのですが、私はどちらが鱗を傾けているのか見ていませんか?
まあ、初期化子リストを使う方がやや効率的ですが、大きな違いはありません。もっと読みやすいものを探してください。 –
実装クラスが集合体である場合、 'p(new MyClass :: Impl {'a、1、true、{1,2,3}})'のようなものを言うことができます。 –