如何初始化初始化器列表中共享公共属性的常量数据成员



假设我们有一个类Bar,它有两个数据成员,ab,分别指向另外两个类型为A的对象。在这个类型A中,我们有一个指向整数的数据成员i

在下面的代码中,为了允许Bar的数据成员,即ab共享相同的指针i。我必须在Bar内创建另一个数据成员,它表示ab将共享的公共指针。

然而,我想知道在初始化初始化器列表中的ab时,是否有任何方法可以共享相同的中间指针i

#include <memory>
using namespace std;
struct A {
const shared_ptr<int> i;
explicit A(const shared_ptr<int> &i): i(i) {}
};
struct Bar {
const shared_ptr<int> _i;
const unique_ptr<A> a;
const unique_ptr<A> b;
explicit Bar(const int &i):
_i(make_shared<int>(i)),
a(make_unique<A>(_i)),
b(make_unique<A>(_i)) {}
};

由于A::ipublic,也是shared_ptr,因此可以消除对Bar::_i的需求,如下所示:

struct Bar {
const unique_ptr<A> a;
const unique_ptr<A> b;
explicit Bar(const int &i):
a(make_unique<A>(make_shared<int>(i))),
b(make_unique<A>(a->i)) {}
};

如果A::i后来成为private,那么简单地使Bar成为Afriend,那么它应该仍然工作。

使用旧代码,您可以这样做:

struct Bar {
const A* a;
const A* b;
explicit Bar(const int &i):
a(new A(new int(i))),
b(new A(a->i)) {}
};

但是,在决定谁负责释放int*时,您可能会遇到管理问题。使用shared_ptr,您不必担心。

相关内容

  • 没有找到相关文章

最新更新