C ++ 11在类中存储多态对象的方法

时间:2016-06-17 18:02:42

标签: c++11 polymorphism smart-pointers

在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方法是什么?

1 个答案:

答案 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明确表示它需要所有权。采用原始指针,然后将其包装在智能指针中,使界面不清楚。