Вот набор предложений, чтобы все работало и начало думать о проблеме более ООП (но это может быть субъективно).
Как указывали другие, основная проблема заключается в том, что w1
является Словом, и вы пытаетесь сделать
w1 = new Word;
Это не имеет смысла, так как new Word
создает указатель на Слово (Word*
), а это не то, что вам нужно.C ++ - это не Java, в которой все является неявным указателем на что-то.Здесь вы можете иметь автоматические объекты (Word) и указатели на объекты (Word *).
С точки зрения дизайна класса вы создаете Word, который должен объединять три строки word
, definition
и type
.Хорошо.Что такое словарь?Название предполагает, что это контейнер для слов, поэтому вектор должен быть атрибутом словаря, а не параметром, который заполняется.В противном случае имя должно быть DictionaryLoader или что-то в этих строках.
Поэтому я бы начал с исправления класса Word.Чтобы упростить ситуацию, я предлагаю, чтобы у вас все было публично, поэтому я буду использовать struct
вместо class
.После Руководство по стилю Google C ++ Я добавил подчеркивание после имен переменных-членов.Поскольку инициализация не нужна, я бы ее избежал.Вместо этого вы будете загружать слова из потока, поэтому неплохо было бы иметь метод для загрузки слова.Оператор был бы еще лучше, но давайте оставим это на будущее.То, как вы читали, не учитывало определения, включая пробелы.Поэтому я позволил себе использовать getline
для использования строк в кавычках (внутри кавычек нет!).
Это пример dictionary.txt
(который вы должны были включить в свой вопрос! Запомните Минимальный, Полный и Проверяемый пример ):
sovereign "a king or queen" noun
desk "a type of table that you can work at, often one with drawers" noun
build "to make something by putting bricks or other materials together" verb
nice "pleasant, enjoyable, or satisfactory" adjective
А здесьидет код.
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
struct Word {
std::string word_;
std::string definition_;
std::string type_;
std::istream& read(std::istream& is) {
is >> word_;
std::string skip;
std::getline(is, skip, '"');
std::getline(is, definition_, '"');
is >> type_;
return is;
}
};
Теперь словарь.Словарь - это контейнер для слов, поэтому в нашем словаре должен быть вектор слов.Все переменные, которые были в вашем словаре, были на самом деле не в нужном месте.Вы использовали их как временные, поэтому они должны были быть размещены внутри вашей функции.
struct Dictionary {
std::vector<Word> vect_;
bool load(const std::string& filename) {
std::ifstream is("dictionary.txt");
if (!is)
return false;
while (true) {
// Read
Word w;
w.read(is);
// Check
if (!is)
break;
// Use
vect_.push_back(w);
}
/* Alternative
Word w;
while (w.read(is)) { // Read & Check
// Use
vect_.push_back(w);
}*/
/* Another alternative
for (Word w; w.read(is);) { // Read & Check
// Use
vect_.push_back(w);
}*/
return true;
}
};
int main()
{
Dictionary d;
if (d.load("dictionary.txt"))
return EXIT_SUCCESS;
else
return EXIT_FAILURE;
}
Проверьте функцию Dictionary::load
.Правило простое: читать, проверять, использовать.Я предлагаю всегда начинать с бесконечного цикла с тремя комментариями.Затем добавьте соответствующий код для чтения, затем для проверки и, наконец, используйте то, что вы только что прочитали.Тогда ищите более компактные альтернативы, если они вам действительно нужны.
Ах, я только что вспомнил: поскольку вы используете VisualStudio, сделайте себе одолжение: не используйте предварительно скомпилированные заголовки.Ты не знаешь, кто они, и, поверь мне, они тебе не понадобятся очень долго.Итак, создайте свои проекты с помощью «Windows Desktop Wizard», не создавайте каталог для решения и в следующем диалоговом окне выберите «Пустой проект».