Легкие проблемы
Легкая проблема для определения здесь:
cin.getline(userEntry, INPUT_LINE_MAX_LEN, ENTER);
Первая проблема заключается в том, что если INPUT_LINE_MAX_LEN == 1, то строка неверна.
Это легко исправить, изменив объявление og userEntry на:
userEntry = new char[INPUT_LINE_MAX_LEN + 1];
Вторая проблема, которую я вижу:
// GARBAGE COLLECTION
delete[] userEntry;
Что неверно, потому что вы выделяете только один символ, а не массив символов для userEntry. То же решение, что и выше.
Лучшее решение состоит в том, чтобы использовать управляемый массив символов (то есть строку)
std::string userEntry;
std::getline(std::cin,userEntry);
Нет необходимости выделять или удалять, и он изменяет размеры по мере необходимости, поэтому вы не можете списать их, а затем завершить.
Другие заботы:
Видя это в коде C ++, вырастают зайцы на спине моего nech:
typedef void (*WordDefFunc)(const char *word, const char *definition);
В C ++ гораздо проще использовать интерфейсы, чем указатели на функции. (Да, я знаю, что в C ++ нет ключевого слова interface. Но концепция интерфейса одинакова во всех языках, это определение класса, реализующее конкретный контракт).
class IFuncAction
{
virtual void action(char const* word,char const* definition) = 0;
};
Вы слишком много занимаетесь управлением памятью в классе.
Я уже вижу несколько утечек памяти (если я выгляжу усерднее, я уверен, что укажу указатели на несуществующие объекты, которые вышли из области видимости).
В современной программе на С ++ очень мало указателей.
- Замените ваш "const char *" и ваш "char *" на std :: string.
- Замените созданные вручную массивы на std :: vector <>
- О. У нас уже есть стандартный словарь. Посмотри std :: map.
Бьюсь об заклад, большинство ваших проблем исчезнет, если вы перестанете пытаться выполнять ручное управление памятью, как это было в программе на Си.
Словарь :: Dectionary
В идеале конструктор словаря должен выглядеть так:
// Pass a stream to the constructor.
// Now a dictionary can be created from a file or
// a string (stringstream) when doing unit tests.
//
Dictionary::Dictionary(std::istream& data)
{
if (!data)
{ throw MyProblemException("Bad Input to Dictionary constructor");
}
Entry item;
// While we can read data from the stream
while(data >> item)
{
// Add it to the store
m_DictEntry.push_back(item);
}
}
std::istream& operator>>(std::istream& str,Entry& data)
{
std::getline(str,data.m_word, COMMA);
std::getline(str,data.m_definition);
return str;
}