Есть ряд вещей, которые могут быть потенциальными проблемами в вашем коде, но наиболее очевидная вещь, которая может заставить printMap
работать не так, как ожидалось, это цикл while.
map<string, int>::iterator it = myMap.begin();
cout<<"test"<<endl;
while(it!=myMap.end()){
cout<<(*it).first<<" ==> "<<(*it).second<<endl;
}
Нигде вы не увеличиваете итератор, поэтому либо ничего не будет напечатано (если карта пуста), либо первый элемент будет напечатан снова и снова, и цикл не прекратится.
Идиоматический способ написать этот цикл - использовать цикл for.
for (std::map<string, int>::iterator it = myMap.begin(); it != myMap.end(); ++it)
{
std::cout << it->first << " ==> " << it->second << '\n';
}
Другая проблема заключается в том, что ваша функция addToMap
, вероятно, не работает должным образом, поскольку вы передаете карту в функцию по значению , и это означает, что карта, к которой функция добавляет элемент на самом деле это копия карты, которая была передана.
Когда управление передается вызывающей функции, эта копия уничтожается, а переданная карта остается пустой.
Чтобы передать карту по ссылке, необходимо добавить &
к типу параметра в объявлении функции.
т.е. в заголовочном файле определение класса MapWorks
:
void addToMap(string myword, map<string, int>& myMap);
и в исходном файле:
void MapWorks::addToMap(string myword, map<string, int>& myMap)
{
// definition...
}
Использование ссылок для динамически размещаемых объектов необычно, если не сказать больше. Для ваших целей я не вижу смысла делать:
ReadWords &rnw = *new ReadNumWords();
при удалении объекта в конце той же функции, в которой он был создан. Вы можете просто сделать это (точно так же, как и с MapWorks mw;
).
ReadNumWords rnw;
Если вам нужно использовать динамически распределяемые объекты, просто использование указателей, а не ссылок, является гораздо более обычным, но настоятельно рекомендуется использовать какой-то умный указатель, чтобы вам не приходилось вызывать delete
явно .