This is my dictionary.h file:
#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
The following is my dictionary.cpp file:
#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;
}
And this is my 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;
}
Now, when I compile this, I get the following error:
dictionary.cpp: In member function 'bool Dictionary::lookup(std::__cxx11::string': dictionary.cpp:83:23: error: expected primary-expression before '->' token Node* tmp = TrieNode->word[i];
What's really bothersome is I don't know if this error is something I'm doing wrong at this point necessarily, or if my constant struggle with pointers means I've screwed up somewhere further back in the chain.
Would help to indicate line numbers, but: Node* tmp = TrieNode->word[i];
TrieNode
is a type, so this doesn't make sense.
Not to mention in createTrie()
where you have a local variable with the same name as the type Node *TrieNode = new Node;
) - perfect example of how naming conventions can help avoid confusion. Most people will tell you "CapitalsForTypes, leadingLowerCaseForVars" (or some_variation_of_that).