2014-01-22 46 views
1

我在努力把这种片的代码到一个班轮:通右值通过引用

std::string filename = "cats"; 
std::shared_ptr<bmd2::Bmd2Dataset> ptr (new bmd2::Bmd2Dataset(filename, bmd2::File::FM_WRITE)); 
bmd2::bmd2Session::getInstance().addDataset(ptr); 

上述工作很大 - 但我可以调用addDataset而不创建左值(线1 + 2) ?

这里是addDataset()的声明:

int addDataset(std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception); 

回答

3
bmd2::bmd2Session::getInstance().addDataset(
    std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE) 
); 

一个statementer。 :)

有趣。为了学习的目的,你能告诉我,如果你没有make_shared()函数调用就可以完成这个任务吗?

您可以使用C++ 11的大括号初始化语法。假设addDataset不是一个模板,具有std::shared_ptr<bmd2::Bmd2Dataset>作为参数,

bmd2::bmd2Session::getInstance().addDataset(
    { new bmd2::Bmd2Dataset("cats", bmd2::File::FM_WRITE) } 
); 

UPDATE:哎呀。所以addDataset()实际上接受l值参考你为什么不立即这么说?addDataset()的参数不能绑定到上面两个例子中的r值参数。为了解决这个问题,你可以:

  • 制作addDataset()的参数const参考

    int addDataset(const std::shared_ptr<bmd2::Bmd2Dataset> &) throw (bmd2Exception); 
    //    ^^^^^ 
    

    做,如果你不需要修改通过shared_ptr参数(即修改它,所以它指向另一个对象)。

  • 使用您的旧方法, 虽然直接传递 "cat"到了 new表达 更新:使用std::make_shared

    auto ptr = std::make_shared<bmd2::Bmd2Dataset>("cats", bmd2::File::FM_WRITE); 
    bmd2::bmd2Session::getInstance().addDataset(ptr); 
    // ptr might now point to some other object 
    

    做,如果你想传递的参数的(ptr)值被改变(即调用它现在可能指向一个新的对象后)。

+0

有趣。为了学习的目的,你能告诉我,如果你没有make_shared()函数调用就可以完成这个任务吗? –

+0

我试过你的例子,并且编译器给出了addDataset()函数没有用正确参数调用的错误: 无效参数'候选者是: int addDataset(std :: shared_ptr &)' 。另一方面,我的代码不会产生这个错误。我更新了我的问题,向您展示addDataset()函数的声明。 –

+0

这是一个很好的答案。非常感谢。保佑你的灵魂:D –