2016-07-06 25 views
1

我有一個MovementSystem類,繼承自System類。後來,我將有一批xxxSystem類的,所以我會存儲xxxSystem的情況下(有每個系統只有一個實例)的地圖是這樣的:C++多態 - 繼承類的地圖

enum 
{ 
    MOVEMENT_SYSTEM 
}; 

std::map<int,std::unique_ptr<System>> systems; 
systems[MOVEMENT_SYSTEM] = std::unique_ptr<System>(new MovementSystem()); 

m_entityManager.loadSystems(&systems); 

最後一行是存在的,因爲我需要我的課EntityManager有權訪問所有的系統。

所以我有這樣的方法:

std::map<int,std::unique_ptr<System>> *m_systems; // this line is in the header 

void EntityManager::loadSystems(std::map<int,std::unique_ptr<System>> *systems) 
{ 
    m_systems = systems; 
} 

終於在EntityManager的其他方法我嘗試訪問我已經派人到類這樣的系統:

std::unique_ptr<MovementSystem> mvt = (*m_systems)[MOVEMENT_SYSTEM]; 
mvt->update(dt); 

,但我得到此錯誤:

conversion from 'std::map<int, std::unique_ptr<System> >::mapped_type {aka std::unique_ptr<System>}' to non-scalar type 'std::unique_ptr<MovementSystem>' requested 

如何解決此問題並獲取最後一行致電更新方法從MovementSystem

+0

表達'* m_systems [ MOVEMENT_SYSTEM]「不符合你的想法。由於[運算符優先級](http://en.cppreference.com/w/cpp/language/operator_precedence),它被翻譯爲'*(m_systems [MOVEMENT_SYSTEM])',它不起作用,因爲'm_systems'是一個指針。您需要使用'(* m_systems)[MOVEMENT_SYSTEM]'。 –

+0

我已經完成了,但錯誤是完全一樣的。 – Urefeu

+0

切線相關:1.指向地圖可能是錯誤的。 2.整個設計看起來很可疑。爲什麼你需要一個基本上存儲單身人士的地圖? –

回答

0
std::unique_ptr<MovementSystem> mvt = *m_systems[MOVEMENT_SYSTEM]; 

這條線有兩個問題。之一,操作者的優先級是這樣的,它會被解釋爲這樣的:

*(m_systems[MOVEMENT_SYSTEM]) 

這意味着它將應用於指針運算到指針m_systems(訪問MOVEMENT-SYSTEM個元素中「陣列」所指向的m_systems)然後將*應用於該地圖,這是無稽之談。你想要的是這樣的:

(*m_systems)[MOVEMENT_SYSTEM] 

第二個問題是你試圖複製一個唯一的指針。這正是獨特的指針設計來防止的。

什麼你可能想簡單地得到的指針,並相應地將其丟:

MovementSystem *mvt = static_cast<MovementSystem*>((*m_systems)[MOVEMENT_SYSTEM].get()); 

,或者甚至更好,因爲它擺脫不必要的指針:

auto &systems = *m_systems; 
auto &mvt = static_cast<MovementSystem&>(*systems[MOVEMENT_SYSTEM]); 
mvt.update(dt); 
+0

感謝您的回答。第一個問題是固定的,第二個問題:它不再顯示錯誤,但程序崩潰。顯示三行之前的「cout」,但MovementSystem :: update()開頭的那個不是。我確實放了一個'cout',事實證明它在'static_cast'的行崩潰。 – Urefeu

+0

@Urefeu這看起來像一個不同的問題,需要一個不同的方法(你需要做一些調試來驗證所有的都是你所假設的),一個潛在的不同的[mcve]等等。嘗試單步調試你的程序,也許使用checked'dynamic_cast'而不是我的'static_cast'等等。如果你仍然堅持,發佈你的發現和一個MCVE作爲一個新問題。 – Angew