2016-07-16 60 views
0

我目前正在處理三個指針的自定義容器,並且有興趣檢測最基本指針的狀態何時發生更改。檢測對未知模板對象的修改

第一個容器(主機)是一個類,它具有指向由模板提供的對象的唯一指針,以及註冊的觀察者列表。當它被銷燬或模板的數據被修改時,它會告訴每個觀察者該事件發生。

第二個容器(Observer)是一個類,它包含一個指向Host的指針和兩個在主機的模板數據被修改(doModified)或主機被刪除(doDeleted)時被調用的lambda函數。它在分配給主機時註冊自己。

第三個容器(ObserverVector)是一個向量,它包含可能註冊或不註冊到不同主機的觀察者。它將自己的函數插入到Observers的lambda函數中,以便在刪除主機時清除它,並且在修改主機時進行自我維護。

實現doDeleted很簡單,但我很難實施doModified。我最初想要的是找出模板的賦值運算符何時被調用,但這不適用於任何可以通過非默認運算符函數修改的對象。我目前最好的解決方案是僅使用容器,其中使用IsModified lambda成員定義的類,在每個修改函數中調用該成員,並讓Host將其中一個函數插入該成員。如果我在我的代碼庫中使用它,這將是一件苦差事。

我在ObserverVector中不使用常規弱指針的主要原因是性能方面的擔憂:我會在遊戲中每次讀取時都會多次讀取每個ObserverVector的整個容器(並且不可避免)。我知道我正在處理一個固有的O(n * log(n))問題,所以減少有效性檢查將幫助我在這方面。實現一種迭代垃圾收集,在遊戲結束時進行掃描是我的最終目標:在下一次遊戲開始前,我要隱藏矢量調整大小和重新排序抖動。長篇小說:我想知道是否有一個不太詳細和較少侵入性的解決方案來確定包含的數據何時被修改,同時仍然保持通用。

回答

0

總的來說,我認爲沒有比你提出的更好的解決方案。通過定義一個基類來處理附加並呼叫doModified回調,你或許可以減少樣板代碼。然後你只需要從該類繼承,併爲每個增變器添加一個函數調用。

例如,

class Modifiable 
{ 
public: 
    addObserver(Observer& observer) { /*...*/ } 
protected: 
    isModified() { /* Invoke callbacks */ } 
private: 
    // Member(s) to manage callback list 
} 

class Foo : public Modifiable 
{ 
public: 
    void set_value(/*...*/) 
    { 
     // Change some member data... 
     isModified(); 
    } 
    // ... 
} 

如果你希望你的Host s到能夠存儲你沒有寫類型,你必須寫一個包裝類爲每個這樣的類型。

0

我不知道是否創建一個管理器類是一個單身包裝周圍的主機和觀察員有一個成員函數接受你的第三個容器作爲輸入。通過這種方式,您的經理類封裝了您的主持人觀察員進行所有檢查,而您的班只做他們需要的工作。因此,如果主持人被刪除,它將回報經理級,經理級將採用該報告並將其分散到所有包含的觀察員或您的觀察員隊列中。另外一句話,這個經理類將做所有的處理,檢查行爲和簿記的變化,同時讓包含的類只做他們需要的工作。