首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在类中存储多态对象的C++11方法

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

Stack Overflow用户
提问于 2016-06-17 18:02:41
回答 1查看 125关注 0票数 1

在C++11之前,我将实现一个类Foo,其中包含基类栏的多态对象,如下所示:

代码语言:javascript
复制
struct Foo {

  Bar* m_b;

  Foo(Bar* b) : m_b(b) {}

}; 

按照Scott关于原始指针不好的建议,我想以Foo的方式实现C++11,但我不知道这会是什么样子。

我开始写它就像

代码语言:javascript
复制
struct Foo {

  std::unique_ptr<Bar> m_b;

  Foo(std::unique_ptr<Bar> b) : m_b(std::move(b)) {}

};

但这有一个缺点,即必须动态分配b

那么,实现包含多态对象的类的C++11方法是什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-17 18:47:20

认为智能指针优于原始指针的论点是基于所有权的。

资源的所有权应该从类型系统中明确,因为这是一件容易出错的事情,而仅仅通过读取代码就很难理解。通过将其嵌入到类型系统中,您可以从对象类型中判断是什么决定了对象的生存期。

预C++11代码要么不拥有Bar (它不对其生命周期负责),要么您的代码泄漏。

后C++11代码拥有Bar,并负责其生命周期.

如果您希望Foo基于可能复杂的运行时逻辑有条件地拥有Bar的状态,而有时不这样做,那么std智能指针可能不是一个好主意。

想象一下你在遵守汽车安全规则之前有一辆车。它有一个按钮把乘客从车里弹了出来。这很有趣,只要你不按按钮,就安全了。

现在,汽车安全规则在这里,你听到遵循它们是“更好”。你来到汽车安全问答会,问你如何设置一个按钮,将乘客从车中逐出,并遵守这些汽车安全规则。他们似乎不允许乘客被驱逐出境。即使你在按钮上盖上盖子,也会发现“如果汽车出了事故,扣子执行得不正确,怎么办”,还有生命和肢体之类的东西。

我怎么能在我的车里有一个弹射座椅而又得到五星级的安全等级呢?

聪明的指针清楚地说明了所有权。如果您混淆了所有权,那么您必须澄清它,以便使用智能指针。

在有些情况下,复杂的所有权和终身语义会被简化。它们很少,而且通过默认使用智能指针,我们可以避免生命周期的复杂性,而不必每次验证它。

代码语言:javascript
复制
struct Foo {
  std::unique_ptr<Bar> m_b;

  Foo(std::unique_ptr<Bar> b) : m_b(std::move(b)) {}
};

这是一个更好的接口,因为Foo的ctor明确表示它拥有所有权。获取原始指针,然后将其封装在智能指针中,会使接口变得不清晰。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37887688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档