2016-07-16 51 views
0

檢索時,我有一個std ::對象指針的地圖四處破壞:std::map<ConnectionID, IConnection *>對象指針通過吸氣

它只會包含三個條目,每個從IConnection *派生,所以我提出了三點便利的獲取器用於檢索每個對象,這會將IConnection *條目轉換爲正確的對象並將其返回。它看起來像這樣:

GameConnection * Client::GetGameConnection() 
{ 
    GameConnection * pGameConn = NULL; 
    if ((pGameConn = (GameConnection *)GetConnection(ConnectionID::GAME_CONNECTION))) 
     return pGameConn; 

    return nullptr; 
} 

通用GetConnection()方法是這樣的:

IConnection * Client::GetConnection(ConnectionID nConnID) 
{ 
    auto result = m_connections.find(nConnID); 

    if (result != m_connections.end()) 
    { 
     return result->second; 
    } 

    return nullptr; 
} 

相當確保GetGameConnection是問題,因爲它的工作原理,如果我找回了整個地圖做:

std::map<ConnectionID, IConnection *> connections = pClient->GetConnections(); 
GameConnection * pGameConn = (GameConnection *)connections.at(ConnectionID::GAME_CONNECTION); 

如果是鑄造到GameConnection *導致問題,如何避免這樣做,和sti我們能夠像pClient->GetGameConnection()->FooBar();一樣方便地調用GameConnection嗎? 從IConnection *GameConnection *的投射應該沒問題,儘管它來自該界面。

+1

的「它只會包含三個條目」 A地圖聽起來簡單的錯誤 –

+1

不整個'GetGameConnection'方法歸結爲'return(GameConnection *)GetConnection(ConnectionID :: GAME_CONNECTION);'?它不應該是'dynamic_cast'而不是C風格的演員? –

+0

@DieterLücking這是一張地圖,因爲我通過它來檢查傳入的數據。感謝你的關心。 Laurent:你說得對,我糾正了這個。 –

回答

1

我寧願建議您使用

std::map<ConnectionID,std::shared_ptr<IConnection>> connections; 

或至少

std::map<ConnectionID,std::weak_ptr<IConnection>> connections; 

,使您的生活更輕鬆。

+0

非常好的建議,但沒有提供任何解釋,爲什麼這將有助於在這種情況下,所以只有資格作爲評論:( –

0

你正在填充m_connections地圖嗎? ,因爲它可能是地圖中沒有值的情況,它會返回nullPtr。

而另一種情況可能是你的指針是越來越過期或成爲晃來晃去,這樣可以防止在使用shared_ptr的

std::map<ConnectionID,std::shared_ptr<IConnection>> connections; 
+0

沒有沒有懸掛指針。問題是,'''客戶端'''除了前向聲明之外並不知道'''GameConnection'',這顯然不足以知道它是從'''IConnection'''派生出來的。謝謝你的回答。 –