在C++11之前,我将实现一个类Foo,其中包含基类栏的多态对象,如下所示:
struct Foo {
Bar* m_b;
Foo(Bar* b) : m_b(b) {}
}; 按照Scott关于原始指针不好的建议,我想以Foo的方式实现C++11,但我不知道这会是什么样子。
我开始写它就像
struct Foo {
std::unique_ptr<Bar> m_b;
Foo(std::unique_ptr<Bar> b) : m_b(std::move(b)) {}
};但这有一个缺点,即必须动态分配b。
那么,实现包含多态对象的类的C++11方法是什么呢?
发布于 2016-06-17 18:47:20
认为智能指针优于原始指针的论点是基于所有权的。
资源的所有权应该从类型系统中明确,因为这是一件容易出错的事情,而仅仅通过读取代码就很难理解。通过将其嵌入到类型系统中,您可以从对象类型中判断是什么决定了对象的生存期。
预C++11代码要么不拥有Bar (它不对其生命周期负责),要么您的代码泄漏。
后C++11代码拥有Bar,并负责其生命周期.
如果您希望Foo基于可能复杂的运行时逻辑有条件地拥有Bar的状态,而有时不这样做,那么std智能指针可能不是一个好主意。
想象一下你在遵守汽车安全规则之前有一辆车。它有一个按钮把乘客从车里弹了出来。这很有趣,只要你不按按钮,就安全了。
现在,汽车安全规则在这里,你听到遵循它们是“更好”。你来到汽车安全问答会,问你如何设置一个按钮,将乘客从车中逐出,并遵守这些汽车安全规则。他们似乎不允许乘客被驱逐出境。即使你在按钮上盖上盖子,也会发现“如果汽车出了事故,扣子执行得不正确,怎么办”,还有生命和肢体之类的东西。
我怎么能在我的车里有一个弹射座椅而又得到五星级的安全等级呢?
聪明的指针清楚地说明了所有权。如果您混淆了所有权,那么您必须澄清它,以便使用智能指针。
在有些情况下,复杂的所有权和终身语义会被简化。它们很少,而且通过默认使用智能指针,我们可以避免生命周期的复杂性,而不必每次验证它。
struct Foo {
std::unique_ptr<Bar> m_b;
Foo(std::unique_ptr<Bar> b) : m_b(std::move(b)) {}
};这是一个更好的接口,因为Foo的ctor明确表示它拥有所有权。获取原始指针,然后将其封装在智能指针中,会使接口变得不清晰。
https://stackoverflow.com/questions/37887688
复制相似问题