要创建B
处于有效状态的对象,您无需再做任何事情。您甚至不必为B
. std::vector<std::shared_ptr<A>>
那是 的成员B
将在B
的构造函数中默认初始化,这意味着它在容器中还没有任何元素。它也将在~B
感谢std::vector
和std::shared_ptr
析构函数中正确删除。
另一方面,例如,如果您想以某种方式对其进行初始化(即 3 个值),则可以在 a的构造函数初始化列表中使用std::vector
'构造函数。例如:std::initializer_list
B
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
s 的生命周期。Nextstd::unique_ptr
更快,因为它不需要线程安全的引用计数。最后但并非最不重要的一点是,它不会花费任何额外的内存(与常规 C 指针相比),而std::shared_ptr
可能需要数十字节(24-48)来存储共享状态数据,这在您对小型类进行操作时非常无效。这就是为什么我总是将std::unique_ptr
智能指针用作我的首选,并且我只std::shared_ptr
在真正需要它时才回退到它。
编辑:
回答您的编辑我将创建 3 个类容器A
, B
, 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
)。然后我将只使用std::vector<A*>
内部B
类和std::vector<B*>
内部C
类,而不使用任何智能指针。
我希望这会有所帮助。
编辑:
更改std::vector
为std::deque
在第一种情况下允许容器元素的引用/指针在具有push_back()
. 然而,它们将无法在擦除元素、排序或其他内容时存活下来。