我有一个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/

10-09 03:24