考慮以下代碼:
struct MyObject {
std::string name;
};
void getOrCreateMyObject(std::shared_ptr<MyObject> myObj) {
if (myObj == nullptr) {
myObj = std::make_shared<MyObject>();
myObj->name = "Created Automatically";
}
std::cout << myObj->name << std::endl;
}
int main() {
std::shared_ptr<MyObject> moPtr = nullptr;
getOrCreateMyObject(moPtr);
if (moPtr != nullptr) {
std::cout << moPtr->name << std::endl;
}
}
如您所見,我將 a 傳遞nullptr給函式,它在其中檢查nullptr并創建 ashared_ptr并成功使用新創建的物件。然而,回到main,moPtr仍然是nullptr。
那么我該如何做才能訪問該函式范圍之外的新物件呢?
先感謝您!
編輯:謝謝大家。將代碼更改為
void getOrCreateMyObject(std::shared_ptr<MyObject>& myObj)
當然,確實有效。不知何故,我錯誤地假設在離開函式時傳遞指標會自動決議為外部指標。
uj5u.com熱心網友回復:
參考這個來源:
C 中有兩種引數傳遞模式:按值傳遞和按參考傳遞。
當引數按值傳遞時,對函式內引數所做的更改不會影響函式呼叫中使用的實際引數的值。
當通過參考傳遞引數時,對引數所做的更改確實會影響客戶空間中的實際引數。此外,還有一種特殊的傳遞陣列引數的方式。
因此,您通過值傳遞引數,這意味著被呼叫函式范圍內的任何更改都只會影響傳遞引數的復制實體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/530129.html
標籤:C 指针范围共享指针
上一篇:如何在回圈中命令Ajax呼叫
下一篇:為什么Obj.*A超出范圍?
