我对 PImpl 进行了相当广泛的使用,而我发现自己正在纠结的事情是在哪里初始化 Pimpl 结构的成员。选项是为Private
结构创建一个构造函数并在那里初始化它们,或者在主类的构造函数中初始化它们。
myclass.hpp:
class MyClass {
public:
MyClass();
~MyClass();
private:
struct Private; unique_ptr<Private> p;
};
我的类.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 往往更具可读性,也许也更易于维护。这里有什么我看不到的东西可能会以一种或另一种方式倾斜天平吗?