这是我的dictionary.h文件:

#ifndef DICTIONARY_H
#define DICTIONARY_H

class Dictionary
{
    public:
        struct Node
        {
            std::string word;
            std::string definition;
            static const int ALPHABET_SIZE = 26;
            Node* next[ALPHABET_SIZE];
        };

        typedef Node TrieNode;
        typedef TrieNode* Trie;

        void createTrie();
        bool insertTrie(std::string word, std::string definition);
        bool loadDictionary(std::string fileName);
        bool lookup(std::string word);
        void deleteTrie();
        bool writeTrie(std::string fileName);
        Dictionary();
        ~Dictionary();
};

#endif // DICTIONARY_H


以下是我的dictionary.cpp文件:

#include <iostream>
#include <string>
#include <fstream>
#include <cctype>
#include "dictionary.h"
 using namespace std;

 Dictionary::Dictionary()
{
    createTrie();
}

Dictionary::~Dictionary()
{
    deleteTrie();
}

void Dictionary::createTrie()
{
    static const int ALPHABET_SIZE = 26;
    Node *TrieNode = new Node;
    TrieNode->word = "";
    TrieNode->definition = "";
    for (int i = 0; i < ALPHABET_SIZE; i++)
    {
        TrieNode->next[i] = nullptr;
    }
}

bool Dictionary::insertTrie(string word, string definition)
{

    static const int ALPHABET_SIZE = 26;
    Node *newNode = nullptr;
    newNode = new Node;
    for (int i = 0; i < word.length(); i++)
    {
    int letter = (int)word[i] - (int)'a';
        newNode->word[letter];
        newNode->definition;
        for (int i = 0; i < ALPHABET_SIZE; i++)
        {
            newNode->next[i] = nullptr;
        }
    }
}

bool Dictionary::loadDictionary(string fileName)
{
    string word;
    string definition;
    fstream dataFile;
    dataFile.open(fileName);
    cout << "Loading dictionary..." << endl;
    if (dataFile)
    {
        getline(dataFile, word, ':');
        getline(dataFile, definition);

        insertTrie(word, definition);
        while (!dataFile.eof())
        {
             getline(dataFile, word, ':');
             getline(dataFile, definition);

             insertTrie(word, definition);
        }
        dataFile.close();
        return 0;
    }
    else
    {
        return 1;
    }
}

bool Dictionary::lookup(string word)
{

    for (int i = 0; i < word.length(); i++)
    {
    //char letter = (char)word[i] - (char)'a';
        Node* tmp = TrieNode->word[i];
    }
}

void Dictionary::deleteTrie()
{
    ;
}

bool Dictionary::writeTrie(string fileName)
{
    fstream dataFile;
    dataFile.open(fileName, fstream::out);
    dataFile.close();
    return 0;
}


这是我的main.cpp:

#include <iostream>
#include <string>
#include <fstream>
#include <cctype>
#include "dictionary.h"
using namespace std;

int main()
{
    string fileName;
    string word;
    char answer = 'y';
    int loaded;
    int written;
    int lookedup;
    Dictionary dic;

    cout << "Please enter the name of the dictionary file: ";
    cin >> fileName;

    dic.createTrie();

    loaded = dic.loadDictionary(fileName);

    while (answer == 'y')
    {
      cout << "Would you like to look up a word? ";
      cin >> answer;

      if (answer == 'n')
      {
          cout << "Would you like to write the dictionary to a file? ";
          cin >> answer;
          if (answer == 'y')
          {
              cout << "Please enter the filename you wish to save it too: ";
              cin >> fileName;

              written = dic.writeTrie(fileName);
              return 0;
          }
      }
      else if (answer == 'y')
      {
          cout << "Enter a word: ";
          cin >> word;

          lookedup = dic.lookup(word);
      }
      else
          cout << "Please select a valid option.";
  }
  return 0;
}


现在,当我编译它时,出现以下错误:


  dictionary.cpp:在成员函数'bool Dictionary :: lookup(std :: __ cxx11 :: string':
  dictionary.cpp:83:23:错误:'->'标记之前的预期主表达式
  Node * tmp = TrieNode-> word [i];


真正令人烦恼的是,我不知道此错误是否一定是我现在在做错​​的事情,还是我与指针的不懈努力意味着我已经把这个问题弄得更糟了。

最佳答案

有助于指示行号,但是:Node* tmp = TrieNode->word[i];

TrieNode是一种类型,因此没有意义。

更不用说在createTrie()中具有与类型Node *TrieNode = new Node;相同名称的局部变量了)-命名约定如何帮助避免混淆的完美示例。大多数人会告诉您“ CapitalsForTypes,leaderLowerCaseForVars”(或some_variation_of_that)。

关于c++ - C++ Trie字典-迷失了两天,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34124282/

10-14 09:27