2014-05-06 31 views
18

的矢量我有這樣的問題:我有Foo類,如果有這個類的一些對象, 的std ::引用

Foo a(); 

我需要把這個對象爲2個不同的向量:

std::vector<Foo> vA, vB; 

並且如果a變化vA它應該在vB被改變,矢量vAvB可以是不同的,但它們CAN H相同的對象。我知道可以用Boost做,但我不能使用Boost。

+3

您的意思是使用['標準::向量<性病:: shared_ptr的>'](http://en.cppreference.com/w/cpp/memory/shared_ptr )? –

+4

請注意像'Foo a();'這樣的聲明不會做你認爲它做的事。它實際上是一個函數'a'的聲明,它不接受任何參數並返回一個'Foo'對象。 –

+3

不知道'Foo a()'是*假設*的意思,但是它聲明瞭一個名爲'a'的函數,返回一個'Foo'。 –

回答

39

有一些可能性:

  1. 商店如果指針的矢量(使用您的載體的股權指針):

    std::vector<std::shared_ptr<Foo>> vA, vB; 
    
  2. 商店包裹引用的矢量(使用如果向量不共享指針的所有權,你知道的對象引用有效過去載體的壽命):

    std::vector<std::reference_wrapper<Foo>> vA, vB; 
    
  3. 存儲原始指針的矢量(如果您的載體不共享指針的所有權使用,和/或存儲指針可能會因其他因素而改變):

    std::vector<Foo*> vA, vB; 
    

    這是常見的觀察,跟蹤分配等。原始指針的通常注意事項適用於:不要使用指針訪問對象在其生命週期結束後。

  4. 商店是包裝對象的std::unique_ptr向量(使用,如果您的向量想交接在這種情況下,引用對象的生命週期是由std::unique_ptr類的規則管轄的指針的所有權):

    std::vector<std::unique_ptr<Foo>> vA, vB; 
    
+1

關於不使用'shared_ptr'的註釋除非在極端條件下才是錯誤的。如果指針用於導航(最常見的情況),則不應該使用'shared_ptr'。 –

+0

在OP的例子中,他似乎打算將他的對象分配到堆棧中,所以我同意@JamesKanze的看法,那就是您的措辭強硬的智能指針建議不合適,並且可能會產生誤導。 – JBentley

+0

@JamesKanze,謝謝 - 我更新了我的帖子。 – utnapistim

2

而不是保持Foo作爲對象保持指向對象Foo的指針,例如,

std::vector<Foo *> vA, vB; 

並仔細管理分配和釋放,以避免內存泄漏(完成時分配但不分配)。如果您分配一個Foo對象並將指針保持在vA和vB中,那麼通過指針保持兩個本質上相同的對象。 否則,你可以使用智能指針(更好) 參考:

What is a smart pointer and when should I use one?

+0

我在猜測人們正在downvoting,因爲有些選項不需要手動(錯誤)管理那些更合適的指針(像'shared_prt'這樣的智能指針)。 – Mat

+0

@Mat:尤其是這個詞*仔細*知道我們都有一兩天不好。 –

+0

你是對的,有兩種選擇,使用託管指針或根據專業知識管理自己的指針。 –

7

您需要一個引用向量。並且,由於您指定需要使用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() 
+0

這使得我不可能(我認爲)改變任何指針(這可能是一個特徵或缺陷,這取決於你對'vector'所做的事情)。 –

+0

OP的唯一要求是存儲對Foo對象的引用,所以這裏沒有指針可以更改。程序員隨時可以隨時更改矢量和變量「a」的任何屬性的內容。根據定義,參考本身是不可變的。 – alpartis

相關問題