2016-07-16 4 views
0

У меня есть зЬй :: карты объект указателей: 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 * должно быть в порядке, хотя оно происходит от этого интерфейса.

+1

Карта «Он будет всегда содержать три записи» звучит просто неправильна –

+1

не ли весь метод GetGameConnection сводится к 'return (GameConnection *) GetConnection (ConnectionID :: GAME_CONNECTION);'? Разве это не будет 'dynamic_cast', а не как C-стиль? –

+0

@ DieterLücking Это карта, потому что я перебираю ее для проверки входящих данных. Спасибо за вашу заботу. Лоран: Вы правы, я исправил это. –

ответ

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

№ Нет никаких оборванных указателей. Проблема заключалась в том, что '' 'Client '' 'не знает о' '' GameConnection'' в стороне от прямого объявления, которое, очевидно, недостаточно, чтобы знать, что оно происходит от '' 'IConnection'''. Спасибо за ответ. –

Смежные вопросы