2010-09-27 56 views
0

我需要在C++中存儲對派生類實例的引用。我考慮使用shared_ptrs向量到基類(因爲它需要持有不同類型的派生類),但是,重要的是容器包含原始指針,而vector(或其他stl容器)則不是這種情況,如果我沒錯的話。有沒有一種方法可以在本地C++中執行此操作,還是必須使用像Boost的ptr_vector這樣的特殊容器?C++:原始指針的容器

編輯:這是我的測試代碼:

class Foo 
{ 
public: 
    Foo() {} 
    virtual ~Foo() {} 
    virtual void set_x(int i) = 0; 
}; 

class Bar : public Foo 
{ 
public: 
    Bar() {} 

    void set_x(int i) 
    { 
     this->x = i; 
    } 

    int x; 
}; 

int main() 
{ 
    Bar bar; 

    // ptr 
    std::cout << &bar << "\n"; 

    std::vector<Foo*> foos; 
    foos.push_back(&bar); 

    // different ptr value 
    std::cout << &foos[0] << "\n"; 

    foos[0]->set_x(1); 

    // however, changes are made 
    std::cout << bar.x; 

    return 0; 
} 

由於提前,

耶拿

+0

會向量(指向您的對象的指針矢量)不適合你嗎? – JoshD 2010-09-27 03:10:43

+0

我不清楚爲什麼一個'shared_ptr'容器不適合你。 – 2010-09-27 03:13:25

+0

我嘗試過,但是當我通過vector.push_back(&instance)添加實例的指針時,向量中的指針與原始指針不同。 – jena 2010-09-27 03:14:13

回答

1

在上例中,您打印的是指針的地址而不是指針的值。

相反的:

// different ptr value 
std::cout << &foos[0] << "\n"; 

// different ptr value 
std::cout << foos[0] << "\n"; 

除此之外您vector<Foo*>會工作得很好。

+0

這是令人沮喪的...當然你是對的。謝謝你指出,我應該考慮一些睡眠。感謝所有人的幫助 - 我對這種虛假抱歉。 – jena 2010-09-27 03:43:29

+0

我很高興能幫上忙。如果這是一個很好的解決方案,您能否將其標記爲公認的答案? – JoshD 2010-09-27 03:45:43

0

如果使用shared_ptr爲您的容器部件,在各成員國仍可以訪問指針原始對象實例。您可以在集裝箱清理後的任何時間獲得shared_ptr的副本,但原始對象仍然是其目標。

對於您可以使用boost::ptr_vector一個簡單的解決方案,沒有提供您的指針在容器中發生兩次 - 這情景將引入棘手資源管理的複雜性,並指出你回shared_ptr

+0

shared_ptr對堆中沒有分配的類型有意義嗎? – jena 2010-09-27 03:27:19

+0

沒有。在這種情況下,當變量超出範圍時,你的'shared_ptr'將指向堆棧上的垃圾,甚至在棧幀展開後甚至可能無法訪問內存。 – 2010-09-27 03:29:15

1

您可以創建一個std :: vector < foo *>,它將保存您交給foo的任何指針。它不會作任何試圖刪除銷燬這些指針,這可能會或可能不是你想要的是,但它會保持與您在傳遞的價值觀。

您還可以創建一個std ::矢量< shared_ptr < foo>>,它將保存指針,這些指針在沒有懸掛的shared_ptr的懸掛副本時將被釋放。那些也將持有你通過的「原創」foo *你可以通過使用shared_ptr :: get()方法來獲得它。

唯一不會看到與派生對象完全相同的指針的是,如果您使用多個類的繼承,並且您的基類包含數據。因爲foo *最終會在這種情況下指向數據的「foo」部分,而這部分數據不一定位於對象的「根」處。

+0

我不使用多重繼承,但基類包含數據。這可能是向量中元素與原始元素有不同指針的原因嗎? – jena 2010-09-27 03:32:23

+0

第一次沒有看到你的例子;另一個答案已經碰到了你的問題,那就是你得到了VECTOR數據的地址,而不是指針本身。睡眠是發展的重要組成部分。 :) – SomeCallMeTim 2010-09-27 04:18:02