Я довольно широко использую 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
объекты или скопировать их или что-то еще, тогда вариант А может быть предпочтительнее. Он также может инициализировать переменные в списке инициализации, чего бы это ни стоило. Но я нахожу, что вариант B имеет тенденцию быть более читабельным и, возможно, более удобным для обслуживания. Есть ли здесь что-то, чего я не вижу, который мог бы наклонить весы в ту или иную сторону?