在C ++ 11之前,我会实现一个类Foo,它包含一个基类Bar的多态对象:
struct Foo {
Bar* m_b;
Foo(Bar* b) : m_b(b) {}
};
根据Scott Meyer的建议,原始指针很糟糕,我想以C ++ 11的方式实现Foo
,但我不知道它会是什么样的。
我开始写它像
struct Foo {
std::unique_ptr<Bar> m_b;
Foo(std::unique_ptr<Bar> b) : m_b(std::move(b)) {}
};
但这有一个缺点,即b
必须动态分配。
那么实现包含多态对象的类的C ++ 11方法是什么?
答案 0 :(得分:4)
智能指针优于原始指针的论点是基于所有权。
资源的所有权应该从类型系统中清楚,因为它很容易出错,而且只需阅读代码就很难理解。通过将其嵌入到类型系统中,您可以从类型中确定对象的生命周期。
pre-C ++ 11代码要么没有Bar
(它的生命周期不负责),要么代码泄露。
post-C ++ 11代码拥有Bar
并负责其生命周期。
如果你想要一个状态,Foo
有条件地拥有Bar
基于可能的复杂运行时逻辑,有时则不然,那么std
智能指针可能不是一个好主意
想象一下,在汽车安全规则之前你有车。它有一个按钮将乘客从车上弹出。这很有趣,只要你没有按下按钮,那就安全了。
现在汽车安全规则在这里,您听到跟随他们的是更好的&#34;。您来到汽车安全Q&amp; A并询问如何设置一个按钮,将乘客从汽车中弹出并遵循这些汽车安全规则。他们似乎不允许乘客弹射。即使你在按钮上盖上一个盖子,也会有一些关于如果汽车发生事故且按钮执行不正确的情况&#34;和生活,肢体和其他东西。
如何在我的车中安装一个顶杆座椅,但却获得了五星安全等级?
智能指针使所有权变得清晰。如果您拥有混乱的所有权,那么您必须澄清它以使用智能指针。
有些情况会使复杂的所有权和生命周期语义变得混乱。这些是很少的,并且通过默认使用智能指针,我们可以避免生命周期的复杂性,而无需每次都验证。
struct Foo {
std::unique_ptr<Bar> m_b;
Foo(std::unique_ptr<Bar> b) : m_b(std::move(b)) {}
};
这是一个更好的界面,因为Foo
的ctor明确表示它需要所有权。采用原始指针,然后将其包装在智能指针中,使界面不清楚。