2013-02-02 50 views
3

我想創建一個C++對象工廠,它將通過id創建一些對象。每個對象都必須有一個引用計數器。如果再次請求具有相同ID的對象,則如果它仍在內存中,則必須返回相同的對象。對象緩存與引用計數器

雖然有東西保持指向某個對象的指針,但該對象不會被刪除。當沒有指向對象的指針而是工廠緩存中的指針時,這個對象被放置在QCache中,如果它在一段時間內不會再被請求,它將被刪除。

實現此目的的最佳方式是什麼?

+1

你的工廠可以發出'shared_ptr's並自己保留'weak_ptr'。然後,當再次請求ID時,嘗試'lock()'weak_ptr'。如果你成功了,你發出結果'shared_ptr',如果你失敗了,你創建一個新的對象。 –

回答

0

這是我該怎麼做的。

首先,factory類只會將觀察指針給它實例化的對象。這樣,當沒有對它們的擁有引用時,對象將被立即刪除,而不會將它們放入隊列中。

然後,factory類將返回共享指針它實例化對象,這些共享指針會指定定製刪除註銷從工廠的破壞時的地圖已刪除的對象。

假設你想要實例有一個構造函數,接受他們的ID作爲參數和功能get_id()返回其ID的對象,這裏是工廠類代碼:

​​

而這你將如何使用它:

struct A 
{ 
    A(int id) : _id(id) { } 
    int get_id() const { return _id; } 
    int _id; 
}; 

int main() 
{ 
    factory<A> f; 

    { 
     shared_ptr<A> pA = f.get_instance(5); 
     shared_ptr<A> pB = pA; 
     // ... 
     // The object with ID 5 will go out of scope and get unregistered 
    } 

    shared_ptr<A> pA = f.get_instance(3); 
    shared_ptr<A> pB = f.get_instance(3); // This will return the existing object 
    // 
    // Instance with ID 3 will go out of scope and get unregistered 
} 
+0

這不適合我的任務,因爲我需要一個緩存(對象結構很慢)。另外我想明確一點,在這裏不需要自定義刪除程序,只需檢查m_map項目是否已過期。看來我找到了解決方案,我希望我會在稍後發佈。 –