Я довольно широко использую PImpl, и что-то, что я обнаружил, что я waffling, это то, где именно, чтобы инициализировать членов структуры 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
или скопировать их вокруг или что-то в этом роде, тогда вариант А может быть предпочтительнее. Он также может инициализировать переменные в списке инициализации, для чего это стоит. Но я считаю, что вариант B имеет тенденцию быть более читабельным и, возможно, более удобным для обслуживания. Есть ли что-то здесь, я не вижу, что может наклонить весы так или иначе?
Ну, используя список инициализаторов немного более эффективный, но это не будет иметь большого значения. Просто делайте то, что вы найдете более читаемым. –
Если класс реализации является агрегатом, вы можете сказать что-то вроде 'p (new MyClass :: Impl {'a', 1, true, {1,2,3}})'. –