gpt4 book ai didi

c++ - 在 pimpl 类中初始化默认值的最佳位置?

转载 作者:行者123 更新时间:2023-11-30 00:56:30 25 4
gpt4 key购买 nike

我相当广泛地使用了 PImpl,我发现自己正在胡扯的一点是究竟在哪里初始化 Pimpl 结构的成员。选项是为 Private 结构创建一个构造函数并在那里初始化它们,或者在主类的构造函数中初始化它们。

我的类.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 往往更具可读性,也可能更易于维护。这里有什么我没有看到的东西可能会以一种方式或另一种方式倾斜天平吗?

最佳答案

一定要遵循 RAII 方法并在您的 Private 类型中初始化成员。如果你把东西放在本地(更重要的是,在合乎逻辑的地方),维护将感谢你。更重要的是,如果您使用选项 A,您将能够拥有 const 成员。

如果您必须从 MyClass 构造函数传递值,那么请为 Private 创建一个合适的构造函数:

struct MyClass::Private {
int const some_var; // const members work now
std::string a_string;

// Option C
Private(int const some_var, std::string const& a_string) :
some_var {some_var},
a_string {a_string}
{}
};

MyClass::MyClass() : p(new MyClass::Private(42,"foo")) {
}

否则您的 Private 成员将被默认构造,只会在以后被覆盖(这与 int 无关,但是更复杂的类型呢?)。

关于c++ - 在 pimpl 类中初始化默认值的最佳位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com