2015-07-20 59 views
4

如何初始化构造函数的初始化列表中的共享指针?如何在构造函数的初始化列表中初始化一个共享指针?

我有这样的:

Foo::Foo (const callback &cb) 
{ 
    Bar bar; 
    bar.m_callback = cb; 
    m_ptr = std::make_shared<Bar>(bar); 

    //... 
} 

我愿把这个到构造器的初始化列表。 喜欢的东西:

Foo::Foo (const callback &cb) : 
    m_ptr(std::make_shared<Bar>(?????)) 
{ 
    // ... 
} 

酒吧是一个struct

struct Bar 
{ 
    callback_type m_callback; 
    // etc. 
}; 
+2

如何'Bar'声明? –

+2

我想你的'Bar'应该有一个构造函数来回调。 – inf

+0

我已经编辑过什么Bar ..准备:) – waas1919

回答

5

添加构造函数explicit Bar::Bar(const callback&)explicit将防止与自动转换相关的错误。

更妙的是,如果Bar是一个聚合,你可以使用一个括号初始化:

Foo::Foo(const callback& cb) 
    : m_ptr(std::make_shared<Bar>(Bar{cb})) 
2

实现一个构造函数Bar::Bar(const callback &)将是显而易见的解决方案......?!?

Foo::Foo(const callback & cb) : 
    m_ptr(std::make_shared<Bar>(cb)) 
{ 
    // ... 
} 
+0

对不起DevSolar ..我忘了说酒吧是一个结构。编辑问题 – waas1919

+1

@ waas1919:你也可以为'struct'编写构造函数,你知道......(在这一点上,'struct'和'class'之间的唯一区别是默认的可见性 - 'private'用于'如果你需要*将Bar作为一个POD类型,那么Alf和Piotr的评论会有其他选择。 – DevSolar