我正在尝试创建一个从文本文件中读取的程序,并将这些单词存储到单个链接列表中。我应该创建自己的链表而不是使用STL。我已经尝试查找了相当数量的教程,但我一直在变量“head”上出错。它说“节点的值类型不能用于初始化Node类型的实体”
这是List.cpp:
#include "List.h"
#include "Node.h"
#include <iostream>
using namespace std;
void List::add(string s){
Node* newNode = new Node();
newNode->addString(s);
newNode->setNext(NULL);
Node *temp = head;
if(temp != NULL)
{
while(temp->Next() != NULL)
{
temp = temp->Next();
}
temp->setNext(newNode);
}
else
{
head = newNode;
}
}
void List::print(){
Node *temp = head;
if(temp == NULL)
{
cout<<"EMPTY"<< endl;
return;
}
if(temp->Next() == NULL)
{
cout<<temp->Word();
cout<< "-->";
cout<< "NULL" << endl;
}
else
{ do{
cout<<temp->Word();
cout<<"-->";
temp = temp->Next();
}
while( temp != NULL);
cout << "NULL" << endl;
}
}
void List::read(ifstream& fin){
while(!fin.eof())
{
fin>>sTemp;
add(sTemp);
}
}
这是Node.h
using namespace std;
#include <string>
class Node
{ string val;
Node* next;
public:
Node(void){}
Node(string s)
{
val = s;
next = nullptr;
}
void addString(string aString){ val = aString;};
void setNext(Node* aNext){next = aNext;};
string Word(){return val;};
Node* Next(){return next;};
string sTemp;
};
这是List.h
#include <string>
#include <fstream>
#include "Node.h"
using namespace std;
class List{
Node* head;
public:
List()
{
head = NULL;
}
void print();
void add(string s);
void find(string key);
void read(ifstream& fin);
string sTemp;
}
在实际的List.cpp下,当我说Node * temp = head时,它给出了一个错误;与上述错误。我有什么理由以及如何解决这个问题?
答案 0 :(得分:0)
此处的部分问题是List.cpp
您已将Node.h
两次包括在内。
我很惊讶编译器没有警告你这件事。似乎它选择重新定义Node
,因此最终会得到两个不兼容的Node
值。您需要在头文件中添加包含防护以防止双重包含
List.h
#if !LIST_H
#define LIST_H
...
#endif
Node.h
#if !NODE_H
#define NODE_H
...
#endif
另请注意,在头文件中包含using
语句通常被认为是不好的做法。而是在标头中使用名称空间限定名称,并将using
语句放入.cpp文件中。