2015-11-13 84 views
0

在此代碼中getDatabase函數是第三方,我無法更改它。 main函數裏面我用了shared_ptr。所以有一個要求,我必須通過Database*通過引用getDatabase函數。我怎樣才能做到這一點?如何將引用傳遞給由std :: shared_ptr管理的指針

#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; 
} 
+1

爲什麼不先創建一個原始指針,調用API,然後在原始指針上構造智能指針? –

+0

我知道可以有多種解決方法。但在這裏我想知道是否有一種直接的方式來傳遞引用由std :: shared_ptr管理的指針。希望你明白我的觀點 –

+1

如果允許shared_ptr爲其嵌入的原始指針提供一個非const引用(左值),我們不會將其稱爲* smart *指針 –

回答

1

shared_ptr::get返回由價值管理的指針,所以你不能返回值綁定到非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()}; 
} 
+0

+爲超載的功能的想法。 –

+0

我同意你的解決方法。但實際上我的問題是有沒有辦法直接將參考指針傳遞給智能指針內的指針。 –

+0

@NayanaAdassuriya沒有,這就是爲什麼我發佈解決方案 – Praetorian

相關問題