我有一個現有的容器,里面裝滿了自動分配的結構物件,如下所示:
std::vector<Object> objectList {obj1, obj2, obj3};
我正在嘗試創建一個新容器useObjectList,該容器由指向那些現有物件的指標/參考組成,以便我能夠訪問和修改任一串列中的物件成員值。
我試圖通過創建一個共享指標容器來實作這一點
std::vector<std::shared_ptr<Object>> useObjectList {std::make_shared<Object>(objectList[1])};
但它根本沒有解決(鑒于我的知識有限,我假設std::make_shared完全構造和/或分配一個新物件?)。
我會很感激我能得到的任何建議。
uj5u.com熱心網友回復:
您可以使用reference_wrapper:
list<int> l {1, 2, 3, 4, 5};
vector<reference_wrapper<int>> v (l.begin(), l.end());
// you can't use subscription in list
// but as you are seeing elements by vector containing their references
// so operator[] works here.
cout << v[3] << '\n'; // outputs 4
for (auto& num : l) {
num *= 2; // original list elements are doubled
}
cout << v[2] << '\n'; // outputs 6
uj5u.com熱心網友回復:
要使用“現有物件的指標/參考的 C 容器”或其他任何東西,您應該了解所有權的概念。摘要:所有權是清理的責任。您應該考慮哪個物體應該洗掉您的物件。通常,每當您更改代碼或向其中添加功能時,您都應該重新考慮這一點。
std::vector<Object> objectList {obj1, obj2, obj3};- 在這里,objectList包含物件的副本obj1,obj2和obj3,并負責洗掉它們(即擁有它們)。無論哪個物體包含原始obj1,obj2并obj3保留這些的所有權(即將洗掉它們)。
更廣泛的背景:
void do_stuff()
{
Object obj1;
Object obj2;
Object obj3;
std::vector<Object> objectList {obj1, obj2, obj3};
}
在這里,函式的范圍(或“堆疊框架”)do_stuff擁有三個物件:當控制超出范圍時,它們將被洗掉。這是一種物件以外的東西擁有物件的情況。
std::vector<Object*> objectList {&obj1, &obj2, &obj3};- 這里,objectList包含指向物件的指標obj1,obj2和obj3。物件本身的所有權并沒有改變——擁有它們的東西會繼續擁有它們。一些評論提到“總是建議避免使用原始指標”;“總是”是無稽之談,但這是說明該建議的一個很好的例子。
更廣泛的背景:
std::vector<Object*> someObjectList;
void do_stuff()
{
Object obj1;
Object obj2;
Object obj3;
std::vector<Object*> objectList {&obj1, &obj2, &obj3};
someObjectList = objectList;
}
這里,函式的堆疊幀do_stuff擁有這三個物件。someObjectList如果您有指向這些物件的指標,很容易將它們“發送”到其他物體(這就是人們“建議避免使用原始指標”的原因;但這里真正的問題是更根本的——它有一個“指向現有物件的指標/參考容器”。這是人們不應該建議做的事情。
如果您真的想參考現有物件,則應確保您的所有權模式支持這一點。您可以通過以下任一方式執行此操作:
使用擁有物件的物體;確保在洗掉“所有內容的所有者”之前洗掉所有指向物件的指標串列。通常,您的應用程式的語意無論如何都需要這樣做。
使用共享所有權。為此,您應該在物件的創建點應用共享所有權。
std::shared_ptr<Object> obj1 = std::make_shared(whatever1); std::shared_ptr<Object> obj2 = std::make_shared(whatever2); std::shared_ptr<Object> obj3 = std::make_shared(whatever3); std::vector<std::shared_ptr<Object>> objectList(obj1, obj2, obj3);您應該考慮這樣一種情況,即指向物件的唯一“鏈接”是您的指標串列。這在您的應用程式中有意義嗎?如果是,請使用共享所有權。如果沒有,這不是一個好主意,因為它隱藏了錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/419348.html
標籤:
