Получение ошибок при попытке передать вектор в функцию класса C ++ - PullRequest
0 голосов
/ 14 апреля 2019

Я пытаюсь прочитать текстовый файл "dictionary.txt", который содержит некоторые слова с их определением и типом. Каждое слово предназначено для загрузки в объект класса Word с определением и типом, затем этот объект должен быть помещен в векторный массив других объектов Word.

Однако я получаю ошибки:

E0147 declaration is incompatible with "void Dictionary::loadDictionary(std::vector<<error-type> std::allocator<<error-type>>> &vect)" (declared at line 27)
*

и * 1006

E0020   identifier "loadDictionary" is undefined.

Я довольно новичок в C ++ и ООП в целом, поэтому хотел бы помочь с этими ошибками.

Спасибо, куча!

Код:

#include "stdafx.h"
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Dictionary
{
public:
    void loadDictionary(vector<Word>& vect);

private:
    Word w1;
    string word;
    string def;
    string type;    
};

void Dictionary::loadDictionary(vector<Word>& vect)
{
    ifstream dicFile;
    dicFile.open("dictionary.txt");


    if (!dicFile)
    {
        cout << "File not found!" << endl;
        exit(1);
    }

    int count1 = 0;
    while (!dicFile.eof())
    {
        w1 = new Word;
        dicFile >> word;
        dicFile >> def;
        dicFile >> type;
        w1.word->word;
        w1.def->def;
        w1.type->type;
        vect.push_back(w1);
    }
}
class Word
{
public:

private:
    string word;
    string definition;
    string type;

};

Word::Word() {
    word = "";
    definition = "";
    type = "";
}




int main()
{
    Dictionary d;
    vector<Word> word;
    d.loadDictionary(word);
    return 0;
}

Ответы [ 3 ]

0 голосов
/ 14 апреля 2019

Код необходимо полностью пересмотреть.Но некоторые быстрые исправления, которые довольно очевидны:

  • Оператор «new» возвращает указатель на объект.В вашем коде вы сохраняете указатель в переменную без указателя типа «Word».
  • Внутри цикла «while» вы пытаетесь получить доступ к объекту «Word» внутри другого «Word», а затемдоступ к закрытым переменным класса внутри функции «loadDictionary».
  • Данные между двумя классами дублируются.
  • Вместо класса для «Word» вы можете использовать «struct», что проще,однако на самом деле не имеет значения, правильно ли вы используете классы.
0 голосов
/ 15 апреля 2019

Вот набор предложений, чтобы все работало и начало думать о проблеме более ООП (но это может быть субъективно).

Как указывали другие, основная проблема заключается в том, что 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», не создавайте каталог для решения и в следующем диалоговом окне выберите «Пустой проект».

0 голосов
/ 14 апреля 2019

Если вы помещаете весь код в один файл, просто создайте объект Dictionary и вызовите функцию loadDictionary ()

Словарь d; d.loadDictionary (слово);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...