的矢量我有這樣的問題:我有Foo
類,如果有這個類的一些對象, 的std ::引用
Foo a();
我需要把這個對象爲2個不同的向量:
std::vector<Foo> vA, vB;
並且如果a
變化vA
它應該在vB
被改變,矢量vA
和vB
可以是不同的,但它們CAN H相同的對象。我知道可以用Boost做,但我不能使用Boost。
的矢量我有這樣的問題:我有Foo
類,如果有這個類的一些對象, 的std ::引用
Foo a();
我需要把這個對象爲2個不同的向量:
std::vector<Foo> vA, vB;
並且如果a
變化vA
它應該在vB
被改變,矢量vA
和vB
可以是不同的,但它們CAN H相同的對象。我知道可以用Boost做,但我不能使用Boost。
有一些可能性:
商店如果指針的矢量(使用您的載體的股權指針):
std::vector<std::shared_ptr<Foo>> vA, vB;
商店包裹引用的矢量(使用如果向量不共享指針的所有權,你知道的對象引用是有效過去載體的壽命):
std::vector<std::reference_wrapper<Foo>> vA, vB;
存儲原始指針的矢量(如果您的載體不共享指針的所有權使用,和/或存儲指針可能會因其他因素而改變):
std::vector<Foo*> vA, vB;
這是常見的觀察,跟蹤分配等。原始指針的通常注意事項適用於:不要使用指針訪問對象在其生命週期結束後。
商店是包裝對象的std::unique_ptr
向量(使用,如果您的向量想交接在這種情況下,引用對象的生命週期是由std::unique_ptr
類的規則管轄的指針的所有權):
std::vector<std::unique_ptr<Foo>> vA, vB;
關於不使用'shared_ptr'的註釋除非在極端條件下才是錯誤的。如果指針用於導航(最常見的情況),則不應該使用'shared_ptr'。 –
在OP的例子中,他似乎打算將他的對象分配到堆棧中,所以我同意@JamesKanze的看法,那就是您的措辭強硬的智能指針建議不合適,並且可能會產生誤導。 – JBentley
@JamesKanze,謝謝 - 我更新了我的帖子。 – utnapistim
而不是保持Foo作爲對象保持指向對象Foo的指針,例如,
std::vector<Foo *> vA, vB;
並仔細管理分配和釋放,以避免內存泄漏(完成時分配但不分配)。如果您分配一個Foo對象並將指針保持在vA和vB中,那麼通過指針保持兩個本質上相同的對象。 否則,你可以使用智能指針(更好) 參考:
我在猜測人們正在downvoting,因爲有些選項不需要手動(錯誤)管理那些更合適的指針(像'shared_prt'這樣的智能指針)。 – Mat
@Mat:尤其是這個詞*仔細*知道我們都有一兩天不好。 –
你是對的,有兩種選擇,使用託管指針或根據專業知識管理自己的指針。 –
您需要一個引用向量。並且,由於您指定需要使用std :: vector,因此要做的正確事情是將對象封裝在std::reference_wrapper
中。This page from C++ reference應該很好地解釋:
vector<reference_wrapper<Foo>> vA, vB;
vA.push_back(a);
vB.push_back(a); // puts 'a' into both vectors
// make changes to 'a'
// use .get() to get the referenced object in the elements of your vector
// vA[0].get() == vB[0].get()
這使得我不可能(我認爲)改變任何指針(這可能是一個特徵或缺陷,這取決於你對'vector'所做的事情)。 –
OP的唯一要求是存儲對Foo對象的引用,所以這裏沒有指針可以更改。程序員隨時可以隨時更改矢量和變量「a」的任何屬性的內容。根據定義,參考本身是不可變的。 – alpartis
您的意思是使用['標準::向量<性病:: shared_ptr的>'](http://en.cppreference.com/w/cpp/memory/shared_ptr )? –
請注意像'Foo a();'這樣的聲明不會做你認爲它做的事。它實際上是一個函數'a'的聲明,它不接受任何參數並返回一個'Foo'對象。 –
不知道'Foo a()'是*假設*的意思,但是它聲明瞭一個名爲'a'的函數,返回一個'Foo'。 –