我有一个对象指针的std :: map:std::map<ConnectionID, IConnection *>
它只包含三个条目,每个条目都来自IConnection *
,因此我已经为检索每个对象制作了三个便利getter,它将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 *
导致问题,那么如何避免这样做,并且仍能像pClient->GetGameConnection()->FooBar();
那样方便地调用GameConnection?
从IConnection *
到GameConnection *
的转换应该没问题,因为它来自该接口。
答案 0 :(得分:1)
我宁愿建议您使用
std::map<ConnectionID,std::shared_ptr<IConnection>> connections;
或至少
std::map<ConnectionID,std::weak_ptr<IConnection>> connections;
让您的生活更轻松。
答案 1 :(得分:0)
您是否正确填充了m_connections地图? 因为它可能是地图中没有值的情况,它将返回nullPtr。
另一种情况可能是你的指针已经过期或变得悬空,所以要防止使用shared_ptr
std::map<ConnectionID,std::shared_ptr<IConnection>> connections;