2015-03-17 5 views
0

Я работаю над одним из своих классов, и я столкнулся с камнем преткновения. Я дам вам образец моего источника, только имена классов, методов и имен переменных разные, но реализация такая же. Вы увидите мою проблему/s, вопрос/с & беспокойства/с в блоке кода соответствующей функции.Поиск по const std :: map

MyClass.h

#ifndef MY_CLASS_H 
#define MY_CLASS_H 

const std::string strOne  = std::string("one"); 
const std::string strTwo  = std::string("two"); 
const std::string strThree = std::string("three"); 
const std::string strUnknown = std::string("unknown"); 

enum Count { 
    ONE, 
    TWO, 
    THREE, 
    UNKNOWN 
}; 

class MyClass { 
private: 
    const std::map<Count, const std::string> m_mCount = createCountMap(); 
    unsigned short m_uCount; 
    std::vector<std::string> m_vItems; 
    std::multimap<const std::string, const std::string> m_mmAssociatedItems; 

public: 
    MyClass(); 
    MyClass(const std::string strItem1, const std::string strItem2); 

    static MyClass* get(); 

    void addItem(Count type, const std::string& strItem2); 
    void addItem(const std::string& strItem1, const std::string& strItem2); 

private: 
    static const std::map<Count, const std::string> createCountMap(); 

}; 

#endif // MY_CLASS_H 

MyClass.cpp

#include "stdafx.h" 
#include "MyClass.h" 

static MyClass* s_pMyClass = nullptr; 

const std::map<Count, const std::string> MyClass:createCountMap() { 
    std::map<Count, const std::string> m; 
    m.insert(std::make_pair(Count::ONE,  strOne)); 
    m.insert(std::make_pair(Count::TWO,  strTwo)); 
    m.insert(std::make_pair(Count::Three, strThree)); 
    m.insert(std::make_pair(Count::UNKNOWN, strUnknown)); 
    return m; 
} // createCountMap 

MyClass* MyClass::get() { 
    if (!s_pMyClass) { 
     return nullptr; 
    } 
    return s_pMyClass; 
} // get 

MyClass::MyClass() : m_uCount(0) { 
    m_vItems.clear(); 
    m_mmAssociatedItems.clear(); 
} // MyClass 

MyClass::MyClass(const std::string& strItem1, const std::string& strItem2) : 
m_uCount(0) { 
    addItem(strItem1, strItem2); 
} // MyClass 

void MyClass::addItem(Count type, const std::string& strItem2) { 
    const std::map<Count, const std::string>::const_iterator it = m_mCount.find(type); 
    if (it == m_mCount.end()) { 
     // Did not find a valid item key! 
     // Throw Exception Here! 
    } 
    m_vItems.push_back(strItem2); 
    m_mmAssociatedItems.insert(std::make_pair(it->second, m_vItems.at(m_uCount))); 
    ++m_uCount; 
} 

void MyClass::addItem(const std::string& strItem1, const std::string& strItem2) { 
    // I need to do a similar thing as above instead of looking through my 
    // const std::map at the key values for a match, with this overloaded 
    // function call I need to use strItem1 as the search item to see if it 
    // is within the contents of this map which would be the map's ->second 
    // value. If not throw a similar error as above otherwise once it is 
    // found populate my vector and multimap same as above and increment 
    // my count variable. 

    // This would logically be my next step 
    const std::map<Count, const std::string>::const_iterator it = m_mCount.begin(); 

    // It Is Within This For Loop That It Fails To Compile! It 
    // Fails At The it++ Part! Is There A Way Around This? Or 
    // Am I Missing Something Simple? 
    for (; it != m_mCount.end(); it++) { 
    // If strItem1 == it->second && it != m_mCount.end() 
    // found it, add items, if not throw error   

    } 

    m_vItems.push_back(strItem2); 
    m_mmAssociatedItems.insert(std::make_pair(strItem1, strItem2)); 
    ++m_uCount; 
} 

В моем источнике, именно эта вторая функция, которая является более важным, то первый! Любая помощь или предложения очень ценится.

+1

Лучше всего не создавать параметры шаблона контейнеров const. Достаточно объявить контейнер сам const. Также необычно объявлять тип возвращаемого значения const. –

ответ

4
const std::map<Count, const std::string>::const_iterator it = m_mCount.begin(); 

Необходимо удалить первые const. В противном случае его нельзя перемещать вперед, и вы не можете проходить через m_mCount.

+0

Я понимаю, что вы говорите, однако я хочу, чтобы эта карта оставалась постоянной с определенным количеством записей. Я не хочу, чтобы что-то было удалено или добавлено к нему, так как это будет таблица поиска. Если это поможет вам понять. –

+0

Я вижу, что вы говорите, я уже назвал свою переменную-член константой, поэтому мне не нужно префикс ее с константой в функции, так как сам итератор является const_iterator. Спасибо! –

+0

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

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