std :: map вопрос на C ++ - PullRequest
       35

std :: map вопрос на C ++

0 голосов
/ 21 июня 2011

Я неуверен в std :: map на c ++:

Я сделал объект C_Configuration, который загружает связанную библиотеку (.so) C_ConfigurationLibrary.

Класс C_Configuration имеет std::map, а The C_ConfigurationLibrary имеет метод, который инициализирует std::map.

Если я получу доступ к std::map из C_Configuration с помощью цикла for:

std::map<const char*, const char*>::iterator l_item;
for(l_item = m_configuration_map.begin();
    l_item != m_configuration.end();
    l_item++)

Это нормально;

Но если я использую:

m_configuration[VALUE_KEY] // the value is NULL

Это не нормально;

Мой КОД:

C_Configuration::C_Configuration()
{
    m_configuration = LoadLibrary(); // load the linked library (.so)

    if(m_configuration != NULL)
    {
        // DEBUG
        LOG_DEBUG("Loading Key from plugin...");

        m_configuration->LoadKeys(m_configuration_map);

        std::map <const char*, const char*>::iterator l_item;
        for ( l_item = l_configuration_map.begin();
              l_item != l_configuration_map.end();
              l_item++ )
        {                
            //THIS IS OK             
        }

        m_configuration_map[FIRST_KEY] // THIS IS NOT OK
    }
}

void C_ConfigLibrary::LoadKeys(std::map<const char*, const char*>& p_configuration_map)
{
    // DEBUG
    LOG_DEBUG("Loading Keys...");

    p_configuration_map.insert ( std::make_pair<const char*, const char*>(FIRST_KEY, FIRST_VALUE) );
    // DEBUG
    LOG_DEBUG("Loaded Key DBUS used: %s",m_dbus_used.c_str());
    p_configuration_map.insert ( std::make_pair<const char*, const char*>(SECOND_KEY,SECOND_VALUE) );
}

Вы можете мне помочь?

Большое спасибо

Ответы [ 2 ]

4 голосов
/ 21 июня 2011

Вы используете const char* s в качестве ключей, но указатели сравниваются по адресам их памяти, а не по тексту, на который они указывают.Следовательно, когда у вас есть строковый литерал в общей библиотеке и один и тот же текст в строковом литерале в основном объекте приложения, они могут иметь разные адреса и не будут сравниваться как ключи.

Вы намноголучше использовать std::string s в качестве ключей, хотя можно использовать const char* в качестве значений.

FWIW, если вы используете const char* в качестве ключа, строковые литералы не только из разных единиц переводаиногда такой привередливый, но вам будет трудно использовать текст из локальных буферов, даже std::string возвращаемые значения * - это просто очень плохая идея.

1 голос
/ 21 июня 2011

Существует ли FIRST_KEY на самом деле, или вы просто используете его в качестве примера, чтобы показать, что вам нужен элемент с данным ключом?

Скорее всего, это не сработает, потому что вы храните C-строки в качестве ключей для вашего std::map. Они сравниваются по их соответствующим адресам, а не по фактическому содержимому строк, что, вероятно, является причиной, по которой он не работает. Вы должны использовать std::string в качестве ключа к карте.

Вы должны опубликовать реальный код, в противном случае вы можете ожидать только догадки. Очевидно, что этот фрагмент кода не является целым, потому что вы используете FIRST_KEY и т. Д., И мы не знаем, что это такое, и у вас несоответствующее количество скобок, а также неполное утверждение, которое может привести к ошибке .

...