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

C++ C++;11具有抽象类的对象组合,c++,c++11,C++,C++11,假设我有一个类Foo,它有一个抽象类Bar的const成员,在构造函数中传递Bar以初始化const成员的正确方法是什么 class Foo { public: Foo(?Bar? bar): bar(?bar?) {}; private: const ?Bar? bar; } 在C++11中,我考虑使用std::unique\u ptr,如下所示: class Foo { public: Foo(std::unique_ptr<Bar> &bar)

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

class Foo
{
public:
    Foo(?Bar? bar): bar(?bar?) {};
private:
    const ?Bar? bar;
}
在C++11中,我考虑使用std::unique\u ptr,如下所示:

class Foo
{
public:
    Foo(std::unique_ptr<Bar> &bar): bar(std::move(bar)) {};
private:
    const std::unique_ptr<Bar> bar;
}
class-Foo
{
公众:
Foo(std::unique_ptr&bar):bar(std::move(bar)){};
私人:
const std::唯一的ptr条;
}
这是最好的方法吗?还有什么其他方法以及我应该在什么时候使用它们?

struct Foo
{
public:
    Foo(std::unique_ptr<Bar> &bar): bar(std::move(bar)) {};
    const std::unique_ptr<Bar> bar;
};
structfoo
{
公众:
Foo(std::unique_ptr&bar):bar(std::move(bar)){};
const std::唯一的ptr条;
};
。。。条形图(指针)不可修改,但其指向的值是

这是你想要的吗

我宁愿认为:

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

private
    std::unique_ptr<const Bar> bar;
};
class-Foo
{
公众:
Foo(std::unique_ptr&bar):bar(std::move(bar)){}
私有的
std::唯一的ptr条;
};

更合适,因为值不是真正的常量。我怀疑这不会编译,因为unique_ptr无法调用析构函数(我想到了自定义deleter的规范),但是bar指向的值是const,这是您真正想要的(我怀疑)。

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