2011-06-21 44 views
0

我有一个关于性病不确定性::地图上C++:的std ::地图问题,关于C++

我这样做,加载链接库(的.so)C_ConfigurationLibrary一个对象C_Configuration

C_Configuration类有一个std::mapThe C_ConfigurationLibrary有一个方法,初始化std::map

如果我接触到std::mapC_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)); 
} 

你能帮助我吗?

感谢这么多

+0

“这不好”是什么意思?这是返回?它会崩溃吗?你也有2个左边的“太多”,这使得代码不太直观。 –

+0

您正在使用'm_configuration [VALUE_KEY]',但您尚未将'VALUE_KEY'插入地图。这是问题吗? – Naveen

+0

“这是不好的”意味着返回值是“NULL”,源代码是一个示例,如果有一些错误为“}”,请忽略它们,代码编译并运行。我认为这是一个内存访问问题,取决于std :: map。 – Gianfranco

回答

4

您正在使用const char* s作为键,但指针在它们的内存地址上进行比较,而不是它们指向的文本。因此,当你在共享库中有一个字符串字面值,并且在主应用程序对象中的字符串字面值中有相同的文本时,它们可以具有不同的地址,并且不会与键值相等。

尽管使用const char*作为值可以安全使用std::string s作为关键字,但要好得多。

FWIW,如果你使用const char*作为重点,不仅是从不同的翻译单位有时挑剔这样的字符串常量,但你已经难以用文字从本地缓存,甚至std::string.c_str()返回值 - 它只是一个非常糟糕的主意。

+1

你是对的,非常感谢。我用std :: map 解决了这个问题。 – Gianfranco

1

是否FIRST_KEY确实存在,或者你只是使用它作为一个例子来说明你想在给定键的元素?

由于您将C字符串存储为std::map的关键字,因此它可能无法正常工作。他们通过各自的地址进行比较,而不是字符串的实际内容,这可能是它失败的原因。您应该使用std::string作为地图的关键字。

虽然你应该发布实际的代码,否则你只能期待猜测工作。很明显,这段代码并不是完整的东西,因为你使用的是FIRST_KEY等等,但我们不知道它们是什么,而且你有一些不匹配的括号,以及一个会产生错误的不完整的语句。

+1

或者,他可以使用strcmp作为地图排序功能(第三个地图模板参数)。 – Benoit