2015-08-09 2 views
0

Я хочу превратить этот единственный .cpp-файл в несколько, но у меня возникают проблемы с этим. Я получаю undeclared identifier и 'children' : is not a member of 'Node' ошибки компилятора.Включая .h Файл для 2 классов

Вот мой оригинальный весь код:

#include <iostream> 
#include <vector> 
using namespace std; 

class Node { 
public: 
    Node(); 
    ~Node() {} 
    char content(); 
    void setContent(char c); 
    bool wordMarker(); 
    void setWordMarker(); 
    Node* findChild(char c); 
    void appendChild(Node* child); 
    vector<Node*> children(); 

private: 
    char m_Content; 
    bool m_Marker; 
    vector<Node*> m_Children; 
}; 

class Trie { 
public: 
    Trie(); 
    ~Trie(); 
    void addWord(string s); 
    bool searchWord(string s); 
    void deleteWord(string s); 
private: 
    Node* root; 
}; 

Node::Node() 
{ 
    m_Content = ' '; m_Marker = false; 
} 

char Node::content() 
{ 
    return m_Content; 
} 
void Node::setContent(char c) 
{ 
    m_Content = c; 
} 
bool Node::wordMarker() 
{ 
    return m_Marker; 
} 
void Node::setWordMarker() 
{ 
    m_Marker = true; 
} 
void Node::appendChild(Node* child) 
{ 
    m_Children.push_back(child); 
} 
vector<Node*> Node::children() 
{ 
    return m_Children; 
} 

Node* Node::findChild(char c) 
{ 
    for (int i = 0; i < m_Children.size(); i++) 
    { 
     Node* tmp = m_Children.at(i); 
     if (tmp->content() == c) 
     { 
      return tmp; 
     } 
    } 

    return NULL; 
} 

Trie::Trie() 
{ 
    root = new Node(); 
} 

Trie::~Trie() 
{ 
    // Free memory 
} 

void Trie::addWord(string s) 
{ 
    Node* current = root; 

    if (s.length() == 0) 
    { 
     current->setWordMarker(); // an empty word 
     return; 
    } 

    for (int i = 0; i < s.length(); i++) 
    { 
     Node* child = current->findChild(s[i]); 
     if (child != NULL) 
     { 
      current = child; 
     } 
     else 
     { 
      Node* tmp = new Node(); 
      tmp->setContent(s[i]); 
      current->appendChild(tmp); 
      current = tmp; 
     } 
     if (i == s.length() - 1) 
      current->setWordMarker(); 
    } 
} 


bool Trie::searchWord(string s) 
{ 
    Node* current = root; 

    while (current != NULL) 
    { 
     for (int i = 0; i < s.length(); i++) 
     { 
      Node* tmp = current->findChild(s[i]); 
      if (tmp == NULL) 
       return false; 
      current = tmp; 
     } 

     if (current->wordMarker()) 
      return true; 
     else 
      return false; 
    } 

    return false; 
} 

// Test program 
int main() 
{ 
    Trie* trie = new Trie(); 
    trie->addWord("Hello"); 
    trie->addWord("Balloon"); 
    trie->addWord("Ball"); 

    if (trie->searchWord("Hell")) 
     cout << "Found Hell" << endl; 

    if (trie->searchWord("Hello")) 
     cout << "Found Hello" << endl; 

    if (trie->searchWord("Helloo")) 
     cout << "Found Helloo" << endl; 

    if (trie->searchWord("Ball")) 
     cout << "Found Ball" << endl; 

    if (trie->searchWord("Balloon")) 
     cout << "Found Balloon" << endl; 

    delete trie; 
} 

Моя попытка:

node.h

#ifndef NODE_INCLUDED 
#define NODE_INCLUDED 

class Node { 
public: 
    Node(); 
    ~Node() {} 
    char content(); 
    void setContent(char c); 
    bool wordMarker(); 
    void setWordMarker(); 
    Node* findChild(char c); 
    void appendChild(Node* child); 
    vector<Node*> children(); 

private: 
    char m_Content; 
    bool m_Marker; 
    vector<Node*> m_Children; 
}; 

#endif // NODE_INCLUDED 

trie.h

#ifndef TRIE_INCLUDED 
#define TRIE_INCLUDED 
class Trie { 
public: 
    Trie(); 
    ~Trie(); 
    void addWord(string s); 
    bool searchWord(string s); 
    void deleteWord(string s); 
private: 
    Node* root; 
}; 
#endif //TRIE_INCLUDED 

node.cpp

#include "node.h" 
#include <iostream> 
#include <vector> 
using namespace std; 

Node::Node() 
{ 
    m_Content = ' '; m_Marker = false; 
} 

char Node::content() 
{ 
    return m_Content; 
} 
void Node::setContent(char c) 
{ 
    m_Content = c; 
} 
bool Node::wordMarker() 
{ 
    return m_Marker; 
} 
void Node::setWordMarker() 
{ 
    m_Marker = true; 
} 
void Node::appendChild(Node* child) 
{ 
    m_Children.push_back(child); 
} 
vector<Node*> Node::children() 
{ 
    return m_Children; 
} 

Node* Node::findChild(char c) 
{ 
    for (int i = 0; i < m_Children.size(); i++) 
    { 
     Node* tmp = m_Children.at(i); 
     if (tmp->content() == c) 
     { 
      return tmp; 
     } 
    } 

    return NULL; 
} 

trie.cpp

Trie::Trie() 
{ 
    root = new Node(); 
} 

Trie::~Trie() 
{ 
    // Free memory 
} 

void Trie::addWord(string s) 
{ 
    Node* current = root; 

    if (s.length() == 0) 
    { 
     current->setWordMarker(); // an empty word 
     return; 
    } 

    for (int i = 0; i < s.length(); i++) 
    { 
     Node* child = current->findChild(s[i]); 
     if (child != NULL) 
     { 
      current = child; 
     } 
     else 
     { 
      Node* tmp = new Node(); 
      tmp->setContent(s[i]); 
      current->appendChild(tmp); 
      current = tmp; 
     } 
     if (i == s.length() - 1) 
      current->setWordMarker(); 
    } 
} 


bool Trie::searchWord(string s) 
{ 
    Node* current = root; 

    while (current != NULL) 
    { 
     for (int i = 0; i < s.length(); i++) 
     { 
      Node* tmp = current->findChild(s[i]); 
      if (tmp == NULL) 
       return false; 
      current = tmp; 
     } 

     if (current->wordMarker()) 
      return true; 
     else 
      return false; 
    } 

    return false; 
} 

main.cpp

#include "node.h" 
#include <iostream> 
#include <vector> 
using namespace std; 

// Test program 

#include "node.h" //is this needed? 
#include "trie.h" //is this needed? 
int main() 
{ 
    Trie* trie = new Trie(); 
    trie->addWord("Hello"); 
    trie->addWord("Balloon"); 
    trie->addWord("Ball"); 

    if (trie->searchWord("Hell")) 
     cout << "Found Hell" << endl; 

    if (trie->searchWord("Hello")) 
     cout << "Found Hello" << endl; 

    if (trie->searchWord("Helloo")) 
     cout << "Found Helloo" << endl; 

    if (trie->searchWord("Ball")) 
     cout << "Found Ball" << endl; 

    if (trie->searchWord("Balloon")) 
     cout << "Found Balloon" << endl; 

    delete trie; 
} 
+0

Это точная копия сообщения об ошибке? На какой линии это происходит? – user2079303

+1

Поскольку «main.cpp» не использует 'Node', вы не должны включать в него« node.h ». Поскольку «trie.cpp» * * использует * Node', вы должны включить его там. И вы должны добавить объявление вперед, 'class Node;', вверху «trie.h». – molbdnilo

+0

@ user2079303 Сообщения об ошибках находятся здесь: http://imgur.com/zVmPBTk –

ответ

1

Так вот что я начала работать, я комментировать вещи, которые я добавлены или удалены.

node.h

#ifndef NODE_INCLUDED 
#define NODE_INCLUDED 

#include <vector> //Class Node uses vector so it should be included 
#include <iostream> //Class Node uses iostream so it should be included 

class Node { 
public: 
    Node(); 
    ~Node() {} 
    char content(); 
    void setContent(char c); 
    bool wordMarker(); 
    void setWordMarker(); 
    Node* findChild(char c); 
    void appendChild(Node* child); 
    std::vector<Node*> children(); 

private: 
    char m_Content; 
    bool m_Marker; 
    std::vector<Node*> m_Children; 
}; 

#endif // NODE_INCLUDED 

trie.h

#ifndef TRIE_INCLUDED 
#define TRIE_INCLUDED 

#include "node.h" //Class Trie uses Node so it should include it 
#include <string> //Class Node uses string so it should include it 

class Trie { 
public: 
    Trie(); 
    ~Trie(); 
    void addWord(string s); 
    bool searchWord(string s); 
    void deleteWord(string s); 
private: 
    Node* root; 
}; 
#endif //TRIE_INCLUDED 

node.cpp

#include "node.h" 
//#include <iostream> 
//#include <vector> 
using namespace std; 
//Here you got all includes right but they should be in the header file! 

Node::Node() 
{ 
    m_Content = ' '; m_Marker = false; 
} 

char Node::content() 
{ 
    return m_Content; 
} 
void Node::setContent(char c) 
{ 
    m_Content = c; 
} 
bool Node::wordMarker() 
{ 
    return m_Marker; 
} 
void Node::setWordMarker() 
{ 
    m_Marker = true; 
} 
void Node::appendChild(Node* child) 
{ 
    m_Children.push_back(child); 
} 
vector<Node*> Node::children() 
{ 
    return m_Children; 
} 

Node* Node::findChild(char c) 
{ 
    for (int i = 0; i < m_Children.size(); i++) 
    { 
     Node* tmp = m_Children.at(i); 
     if (tmp->content() == c) 
     { 
      return tmp; 
     } 
    } 

    return NULL; 
} 

trie.cpp

#include "trie.h" //Trie.cpp should at least contain its header file 

Trie::Trie() 
{ 
    root = new Node(); 
} 

Trie::~Trie() 
{ 
    // Free memory 
} 

void Trie::addWord(string s) 
{ 
    Node* current = root; 

    if (s.length() == 0) 
    { 
     current->setWordMarker(); // an empty word 
     return; 
    } 

    for (int i = 0; i < s.length(); i++) 
    { 
     Node* child = current->findChild(s[i]); 
     if (child != NULL) 
     { 
      current = child; 
     } 
     else 
     { 
      Node* tmp = new Node(); 
      tmp->setContent(s[i]); 
      current->appendChild(tmp); 
      current = tmp; 
     } 
     if (i == s.length() - 1) 
      current->setWordMarker(); 
    } 
} 


bool Trie::searchWord(string s) 
{ 
    Node* current = root; 

    while (current != NULL) 
    { 
     for (int i = 0; i < s.length(); i++) 
     { 
      Node* tmp = current->findChild(s[i]); 
      if (tmp == NULL) 
       return false; 
      current = tmp; 
     } 

     if (current->wordMarker()) 
      return true; 
     else 
      return false; 
    } 

    return false; 
} 

main.cpp

//#include "node.h" //You don't use Node here, so don't include it! 
        //Keep your code simple 
#include <iostream> 
#include <vector> 
using namespace std; 

// Test program 

//#include "node.h" //is this needed? Not needed because you don't use 
        //its declarations directly here and 
        //you had it declared before 
#include "trie.h" //is this needed? Yes, it is. You use that class 
        //directly here, so it should include it 
int main() 
{ 
    Trie* trie = new Trie(); 
    trie->addWord("Hello"); 
    trie->addWord("Balloon"); 
    trie->addWord("Ball"); 

    if (trie->searchWord("Hell")) 
     cout << "Found Hell" << endl; 

    if (trie->searchWord("Hello")) 
     cout << "Found Hello" << endl; 

    if (trie->searchWord("Helloo")) 
     cout << "Found Helloo" << endl; 

    if (trie->searchWord("Ball")) 
     cout << "Found Ball" << endl; 

    if (trie->searchWord("Balloon")) 
     cout << "Found Balloon" << endl; 

    delete trie; 
} 

Кстати, вы не должны использовать using namespace в заголовочных файлах, так как это bad practice

+2

Не помещайте 'using namespace' в файл заголовка; это просто приводит к горю. http://stackoverflow.com/questions/5849457/using-namespace-in-c-headers –

+0

Я был в этом сомневаюсь, спасибо за разъяснение! – 0rkan

+0

@Albert Большое спасибо! Поэтому для хорошей практики 1. «Библиотека включает» должна идти только в заголовках 2. использование пространства имен должно быть в .cpp, если необходимо –

Смежные вопросы