C++ 简单 LinkedList 超出范围变量
C++ Simple LinkedList out of scope variables
我正在尝试创建一个 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
Node
本身并没有引用代码中的有效类型。您需要使用 Node<T>
.
当编译器遇到 Node
时,它会将其标记为非法使用并丢弃使用该类型定义的变量或成员,从而在以后的编译中使用该变量或成员时导致其他错误。
一旦你切换到使用 Node<T>
的完整类型,你将 运行 进入另一个答案中提到的问题 Node<T>
class.
class 的数据成员默认是私有的。它们在结构上默认为 public。也就是说,在:
class Node
{
T data;
Node* next;
};
LinkedList class 对节点的成员不可见。尝试使用:
struct Node {
T data;
Node* next;
};
或
class Node {
public:
T data;
Node* next;
};
在风格上,大多数实际实现将 Node 作为私有成员结构嵌套在 LinkedList 中 class。
我希望我的回答对其他人也有帮助,即使我迟到了哈哈:) :
#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();
}
我正在尝试创建一个 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
Node
本身并没有引用代码中的有效类型。您需要使用 Node<T>
.
当编译器遇到 Node
时,它会将其标记为非法使用并丢弃使用该类型定义的变量或成员,从而在以后的编译中使用该变量或成员时导致其他错误。
一旦你切换到使用 Node<T>
的完整类型,你将 运行 进入另一个答案中提到的问题 Node<T>
class.
class 的数据成员默认是私有的。它们在结构上默认为 public。也就是说,在:
class Node
{
T data;
Node* next;
};
LinkedList class 对节点的成员不可见。尝试使用:
struct Node {
T data;
Node* next;
};
或
class Node {
public:
T data;
Node* next;
};
在风格上,大多数实际实现将 Node 作为私有成员结构嵌套在 LinkedList 中 class。
我希望我的回答对其他人也有帮助,即使我迟到了哈哈:) :
#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();
}