Наиболее вероятная причина этой проблемы - текстовые файлы не были открыты. Добавьте проверку с помощью is_open
, чтобы убедиться, что они были открыты.
При использовании Относительных путей (любой путь, который не идет до корня файловой системы (и является Абсолютным путем)), следите за тем, чтобы программа запускалась из каталога, в который вы верите это быть. Это не всегда тот же каталог, что и исполняемый файл. Термин поиска, чтобы использовать, чтобы узнать больше об этом: Рабочий каталог.
Теперь по другим причинам эта программа не будет работать:
void addWordToDictionary(char* word) { words_ += *word; };
не добавляет слова в словарь. Вместо этого он продвигает адрес, по которому words_
указывает на числовое значение буквы в *word
. Это крайне деструктивно, поскольку теряет указатель на буфер, выделенный для words_
в конструкторе, что делает delete[] words_;
в деструкторе Dictionary
неэффективным и, вероятно, смертельным.
Вместо этого вы хотите (заметьте, я использую , хочу с небольшим трепетом. Что вы действительно хотите сделать, так это использовать std::vector
и std::string
, но я сильно подозреваю, что это нарушило бы назначение маркер)
Word
с new
. words_
. Что-то вроде words_[numberOfWordsInDictionary_] = myNewWord;
numberOfWordsInDictionary_
на 1. Обратите внимание, что все Word
, выделенные с помощью new
, должны быть освобождены в деструкторе Dictionary
. Вам понадобится цикл for
, чтобы помочь с этим.
Кроме того, я бы переместил
if (numberOfWordsInDictionary_ == capacity_)
{
resize();
}
из Dictionary
в addWordToDictionary
, чтобы каждый раз, когда вызывается addWordToDictionary
, он имеет правильный размер.
Ммм. Пока мы на этом, давайте посмотрим на resize
void resize() {
capacity_ = capacity_ * 2;
cout << "Size = " << capacity_ << endl;
};
Это увеличивает capacity_
объекта, но ничего не делает, чтобы выделить больше памяти для words_
. Это должно быть исправлено. Вы должны:
capacity_
. У вас уже есть это. words_
на new
. Word
из words_
в больший буфер. words_
words_
на новый, больший буфер. Я не очень внимательно изучил find
, потому что резня, необходимая для исправления чтения и хранения словаря, скорее всего сделает find
непригодной для использования, даже если он в настоящее время работает , Использование reinterpret_cast
, однако, является сигналом тревоги. Не должно быть никаких причин для приведения, не говоря уже о наиболее разрешительных из них, в функции поиска. Практическое правило. Когда вы видите reinterpret_cast
и не знаете, для чего он нужен, предположите, что он скрывает ошибку, и подходите к ней с осторожностью и подозрением.
В дополнение к изучению правила трех, упомянутого в комментариях, обратите внимание на правило пяти . Это позволит вам сделать гораздо более простой и, возможно, более эффективный словарь, основанный на Word* words_
, где words_
будет указывать на массив Word
непосредственно вместо указателей на Word
с.
Если Вам не нужна поддержка режима разработки, Вы можете просто, во времени выполнения, изменять Родителя экземпляра ListBox от одной вкладки до другого (удостоверяющийся устанавливать расположение соответственно, конечно).
По существу это:
listBox1.Parent = tabControl1.TabPages[1];
В конце, хотя, Вы, вероятно, найдете легче просто иметь два ListBox с тем же источником данных.
Да, я думаю, что Вам будет нужно управление ListBox на каждой вкладке. Если у них есть те же данные, можно использовать тот же DataSource для обоих все же.
Если Вы захотите полную поддержку разработчика, то Вам будут нужны два поля. Если выполнение его в коде достаточно, можно создать единственное поле списка на загрузке формы и вручную добавить ссылку на нее на каждую вкладку.