我正在尝试创建一个LinkedList
来获取用户信息并将其存储到其节点中。之后它将显示用户信息。我已经完成了这项工作,这就是我所拥有的:
#include <iostream>
using namespace std;
template <typename T>
class Node
{
T data;
Node* next;
};
template <typename T>
class LinkedList
{
public:
//Default constructor
LinkedList(){
head = NULL;
tail = NULL;
}
void addData(T val){
Node* newNode = new Node;
newNode->data = val;
newNode->next = NULL; // we add newNode at end of linked list
if( head == NULL){
head = newNode;
tail = newNode;
}
else{
tail ->next = newNode;
tail = newNode;
}
}
void printData() {
for(Node* i = head; i!=NULL; i = i -> next){
cout << i->data << " " ;
}
}
private:
//Declare the head and tail of the LinkedList
Node* head;
Node* tail;
};
int main(){
LinkedList<string> usrInput;
cout << "Enter a number or word : ";
string input ;
cin >> input;
usrInput.addData(input);
usrInput.printData();
LinkedList<int> numbers;
while (true)
{
cout<< "Enter a number (-1 to stop): ";
int num;
cin >> num;
if (num == -1)
break;
numbers.addData(num);
}
numbers.printData();
}
问题在于,当我编译程序时,我得到一堆错误,引用了超出范围的成员变量。成员变量不是假设是私有的吗?
这就是我对调试器所拥有的:
46:9: error: invalid use of template-name 'Node' without an argument list
47:9: error: invalid use of template-name 'Node' without an argument list
In constructor 'LinkedList<T>::LinkedList()':
18:9: error: 'head' was not declared in this scope
19:9: error: 'tail' was not declared in this scope
In member function 'void LinkedList<T>::addData(T)':
23:13: error: missing template arguments before '*' token
23:15: error: 'newNode' was not declared in this scope
23:29: error: invalid use of template-name 'Node' without an argument list
26:13: error: 'head' was not declared in this scope
28:13: error: 'tail' was not declared in this scope
32:13: error: 'tail' was not declared in this scope
In member function 'void LinkedList<T>::printData()':
38:17: error: missing template arguments before '*' token
38:19: error: 'i' was not declared in this scope
38:23: error: 'head' was not declared in this scope
答案 0 :(得分:3)
默认情况下,类的数据成员是私有的。它们在结构上默认是公共的。也就是说,在:
class Node
{
T data;
Node* next;
};
LinkedList类无法看到Node的成员。尝试使用:
struct Node {
T data;
Node* next;
};
或
class Node {
public:
T data;
Node* next;
};
在风格上,大多数实际实现将Node作为LinkedList类中的私有成员结构嵌套。
答案 1 :(得分:1)
Node
并未引用代码中的有效类型。您需要使用Node<T>
。
当编译器遇到Node
时,它会将其标记为非法使用,并丢弃使用该类型定义的变量或成员,在使用变量或成员时,在编译后面会导致其他错误。
切换为使用Node<T>
的完整类型后,您将遇到Node<T>
类成员的私有成员资格的其他答案中提到的问题。
答案 2 :(得分:0)
我希望我的答案对其他人也有帮助,即使我迟到了哈哈:):
#include <iostream>
using namespace std;
template <typename Type>
class Node
{
template<typename T> friend class LinkedList;/* you need to make your linkedList
class a friend variable to be able to,acces the private members directly from the objects inside the class Linkedlist.
other option its to make them public, but it is not recomended and other option si to make functions to acces de data, but this will be very messy, just make your linkedlist class friend*/
Type data;
Node<Type>* next; // you need to specify which data type the node will be
};
template <typename T>
class LinkedList
{
public:
//Default constructor
LinkedList(){
head = NULL;
tail = NULL;
}
void addData(T val){
// you can't forget to specify the data type since it is a template!!
Node<T>* newNode = new Node<T>();
newNode->data = val;
newNode->next = NULL; // we add newNode at end of linked list
if( head == NULL){
head = newNode;
tail = newNode;
}
else{
tail ->next = newNode;
tail = newNode;
}
}
void printData() {
// again specify the data type of the template
for(Node<T>* i = head; i !=NULL; i = i -> next){
cout << i->data << "\n" ;
}
}
private:
//Declare the head and tail of the LinkedList
Node<T>* head;// Again specify the data type of the template
Node<T>* tail;// here the same thing
};
int main(){
LinkedList<string> usrInput;
cout << "Enter a number or word : ";
string input ;
getline(cin,input);// use the get line function to get strings from standar input
usrInput.addData(input);
usrInput.printData();
// Declare the num variable otuside and initialize it, you should always initialize the variables
int num(0);
LinkedList<int> numbers;
while (true)
{
cout<< "Enter a number (-1 to stop): ";
// you need to validate the input if you don't want to run an infinite loop
if(!(cin >> num)){
cin.clear();
cin.ignore(100,'\n');
}
else {
// if we succes with the imput you can add the data to the linked list :)
if (num == -1){break;}
numbers.addData(num);
}
}
numbers.printData();
}