如何传递对 std::shared_ptr 管理的指针的引用

How to pass reference to pointer managed by std::shared_ptr

在此代码中 getDatabase 函数是第 3 方,我无法更改它。在 main 函数中我使用了 shared_ptr。所以有一个要求我必须通过引用将 Database* 传递给 getDatabase 函数。我怎样才能做到这一点?

 #include <iostream>
 #include <memory>

 class Database
 {
 };

 void getDatabase(Database*& pDb)
 {
     pDb = createNewDatabase();
 }

 int main()
 {
     std::shared_ptr<Database> pDb=NULL;
     getDatabase(pDb.get()); // Here is the issue pDb.get() doesn't do what I need   
     return 0;
 }

shared_ptr::get return 是按值管理的指针,因此您不能将 return 值绑定到非 const 引用。

解决这个问题的方法是首先使用原始指针创建数据库,然后将所有权转移给 shared_ptr。您可以选择将该代码包装在您自己的 getDatabase() 重载中,以保持您的调用站点干净。

void getDatabase(Database*& pDb)
{
    pDb = createNewDatabase();
}

std::shared_ptr<Database> getDatabase()
{
    Database *db = nullptr;
    getDatabase(db);
    return std::shared_ptr<Database>{db};
}

int main()
{
    std::shared_ptr<Database> pDb{getDatabase()};
}