要在有效状态下创建B
对象,您不必再做任何事情。您甚至不必为B
声明和实现构造函数和析构函数。 std::vector<std::shared_ptr<A>>
是B
的成员将在B
的构造函数中默认初始化,这意味着它在容器中还没有任何元素。由于std::vector
和std::shared_ptr
析构函数,它也将在~B
中正确删除。
另一方面,如果你想例如初始化它(即,3值),您可以在B
的构造函数初始化列表中使用std::vector
的std::initializer_list
构造函数。例如:
class B
{
public:
B(): _innerArray{ std::make_shared<A>(),
std::make_shared<A>(),
std::make_shared<A>() } {}
~B() {}
private:
std::vector<std::shared_ptr<A>> _innerArray;
};
记住std::make_shared
使用完美转发,所以你通过A
的构造函数的参数作为函数的参数,而不是类对象本身。
回答您对设计的关注我想鼓励您在决定分享之前首先考虑向量中成员的独占所有权。
class B
{
public:
B();
~B();
private:
std::vector<std::unique_ptr<A>> _innerArray;
};
以上实施方式在许多方面更为有效。首先,它让你的设计更清晰地说明谁是负责A
的使用寿命。 Next std::unique_ptr
更快,因为它不需要线程安全引用计数。最后但并非最不重要的是它不会花费任何额外的内存(与普通的C指针相比),而std::shared_ptr
可能需要几十个字节(24-48)来存储共享状态数据,这对于小型操作时非常无效。这就是为什么我总是使用std::unique_ptr
作为我的第一款度假智能指针,而当它真的需要时,我只能退回到std::shared_ptr
。
编辑:
回答您的编辑我将创建的类A
,B
3个容器,C
。根据这一事实,如果你需要他们多态与否我将存储一样,要么值(非多态类型):
std::deque<A> as;
std::deque<B> bs;
std::deque<C> cs;
或(多态类型):
std::vector<std::unique_ptr<A>> as;
std::vector<std::unique_ptr<B>> bs;
std::vector<std::unique_ptr<C>> cs;
的顺序
(as
必须比bs
长,bs
必须长于cs
)。然后我只需里面的B
类和std::vector<B*>
里面的C
类没有任何智能指针的使用。
我希望有帮助。
编辑:
在其允许的引用第一壳体改变std::vector
到std::deque
/指针容器元素生存容器与扩展push_back()
。然而,他们将无法生存擦除元素,排序或其他东西。
完美检查:你需要指针吗?如果是这样,它应该是一个共享指针? –
B类应该有权访问但不拥有其他地方存储的某些对象。我没有看到在这里使用unique_ptr而不是shared_ptr,但我是智能指针的noob。 –
@Pavel你是对的:你的场景排除使用'unique_ptr',它强制使用指针。但是,如果'B'不应该拥有所有权,我甚至会考虑使用原始指针而不是共享指针。毕竟,后者表示共享所有权(但也许这就是你最终需要的)。 –