我有一个std :: map对象指针: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 *
的强制转换导致问题,那么如何避免这样做,并且仍然能够像pClient->GetGameConnection()->FooBar();
那样方便地调用GameConnection?从
IConnection *
到GameConnection *
的转换应该可以,尽管它是从该接口派生的。 最佳答案
我宁愿建议您使用
std::map<ConnectionID,std::shared_ptr<IConnection>> connections;
或者至少
std::map<ConnectionID,std::weak_ptr<IConnection>> connections;
使您的生活更轻松。
关于c++ - 通过getter检索std::map中的对象指针会损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38415000/