具有抽象类的 C++11 对象组合

Posted

技术标签:

【中文标题】具有抽象类的 C++11 对象组合【英文标题】:C++11 object composition with abstract classes 【发布时间】:2013-10-15 02:46:42 【问题描述】:

假设我有一个类 Foo,它具有抽象类 Bar 的 const 成员,在构造函数中传递 Bar 以初始化 const 成员的正确方法是什么?

class Foo

public:
    Foo(?Bar? bar): bar(?bar?) ;
private:
    const ?Bar? bar;

在 C++11 中,我想像这样使用 std::unique_ptr:

class Foo

public:
    Foo(std::unique_ptr<Bar> &bar): bar(std::move(bar)) ;
private:
    const std::unique_ptr<Bar> bar;

这是最好的方法吗?还有哪些其他方法以及我应该何时使用它们?

【问题讨论】:

看来const Bar* 会起作用,对吧?关于使用 std::unique_ptr 的原因有什么想法吗? 我看不出有什么问题(我不会使用引用,因为它已经是一个“指针”)。您预计会遇到什么问题,或者遇到了什么问题? 如果您要选择std::unique_ptr,我发现如果您按价值来论证会更好。它将使您能够传递临时对象,对于非临时对象,用户代码必须显式地 std::move 参数,从而更清楚地表明您的构造函数正在窃取 std::unique_ptr 的内容 我认为通过右值引用传递std::unique_ptr 更好。但是,如果您要从中获取move,则绝对不应该通过非常量左值引用来获取它。 【参考方案1】:

在...

struct Foo

public:
    Foo(std::unique_ptr<Bar> &bar): bar(std::move(bar)) ;
    const std::unique_ptr<Bar> bar;
;

... bar(指针)不可修改,但指向的值是可修改的。

这是你想要的吗?

我宁愿认为:

class Foo

public:
    Foo(std::unique_ptr<const Bar>& bar): bar(std::move(bar)) 

private
    std::unique_ptr<const Bar> bar;
;

会更合适,因为值不是真正恒定的。我怀疑这不会编译,因为 unique_ptr 不能调用析构函数(自定义删除器的规范),但 bar 指向的值是 const,这是你真正想要的(我怀疑)。

【讨论】:

以上是关于具有抽象类的 C++11 对象组合的主要内容,如果未能解决你的问题,请参考以下文章

java 面向对象(封装 组合 抽象类 接口)封装组合

面向对象几大原则

Day30:类的抽象类的组合应用

Day18:类的抽象类的组合应用

Day30:类的抽象类的组合应用

类的组合