假设我们有一个类Bar
,它有两个数据成员,a
和b
,分别指向另外两个类型为A
的对象。在这个类型A
中,我们有一个指向整数的数据成员i
。
在下面的代码中,为了允许Bar
的数据成员,即a
和b
共享相同的指针i
。我必须在Bar
内创建另一个数据成员,它表示a
和b
将共享的公共指针。
然而,我想知道在初始化初始化器列表中的a
和b
时,是否有任何方法可以共享相同的中间指针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::i
是public
,也是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
成为A
的friend
,那么它应该仍然工作。
使用旧代码,您可以这样做:
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
,您不必担心。