У меня есть зЬй :: карты объект указателей: std::map<ConnectionID, IConnection *>
указателя объекта в станде :: карте поврежденный при извлечении через геттер
Он будет всегда содержать только три записи, где каждый унаследовано от IConnection *
, так что я сделал три удобные getters для извлечения каждого объекта, который отличает запись 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 Вы сможете легко вызвать GameConnection, например, pClient->GetGameConnection()->FooBar();
? Литье от IConnection *
до GameConnection *
должно быть в порядке, хотя оно происходит от этого интерфейса.
Карта «Он будет всегда содержать три записи» звучит просто неправильна –
не ли весь метод GetGameConnection сводится к 'return (GameConnection *) GetConnection (ConnectionID :: GAME_CONNECTION);'? Разве это не будет 'dynamic_cast', а не как C-стиль? –
@ DieterLücking Это карта, потому что я перебираю ее для проверки входящих данных. Спасибо за вашу заботу. Лоран: Вы правы, я исправил это. –