2013-10-07 55 views
0

我想在C++中实现链接列表,但每次编译时,都会收到一条说明'Node* Node::nextPtr' is private的错误。如果我更改nextPtr以获得公共保护,那么我不会收到错误消息,而且我的列表没有问题。有人可以告诉我为什么这是和如何解决它?我listnode类如下所示:C++链接列表中的私人指针错误

//list.h 
#include <string> 

#include "node.h" 

using namespace std; 

class List 
{ 

    public: 
      List(); 

      bool isEmpty(); 
      void insertAtFront(string Word); 
      void displayList(); 

    private: 
      Node * firstPtr; 
      Node * lastPtr; 

}; 


//node.h 
#ifndef NODE_H 
#define NODE_H 

#include <string> 

using namespace std; 

class Node 
{ 

    public: 
      Node(string arg); 

      string getData(); 



    private: 
      string data; 
      Node * nextPtr; 


}; 


//node.cpp 
#include <iostream> 
#include <string> 

#include "node.h" 

using namespace std; 

Node::Node(string arg) 
    :nextPtr(0) 
{ 
    cout << "Node constructor is called" << endl; 
    data = arg; 

} 

string Node::getData() 
{ 
    return data; 
} 


//list.cpp 
#include <iostream> 

#include "list.h" 
#include "node.h" 

using namespace std; 

List::List() 
    :firstPtr(0), lastPtr(0) 
{ 
} 

bool List::isEmpty() 
{ 
    if(firstPtr == lastPtr) 
      return true; 
    else 
      return false; 
} 

void List::displayList() 
{ 
    Node * currPtr = firstPtr; 

    do 
    { 

      if(currPtr->nextPtr == lastPtr) // Error here 
        cout << endl << currPtr->getData() << endl; 
      cout << endl << currPtr->getData() << endl; 

      currPtr = currPtr->nextPtr; //Error here 

    } 
    while(currPtr != lastPtr); 

} 

void List::insertAtFront(string Word) 
{ 

    Node * newPtr = new Node(Word); 

    if(this->isEmpty() == true) 
    { 
      firstPtr = newPtr; 
      cout << "Adding first element...." << endl; 
    } 
    else if(this->isEmpty() == false) 
    { 
      newPtr->nextPtr = firstPtr; //Error here 
      firstPtr = newPtr; 
      cout << "Adding another element...." << endl; 
    } 
} 
+1

你能向我们展示的行代码与错误? – luiscubal

+0

drop'friend class List;'就在'class Node {'声明中。或者更好的是,考虑将'Node'作为'class List'的私有嵌套类,即将它放在它所属的位置。 – WhozCraig

+0

我在最后添加了两个类的实现文件。 – rafafan2010

回答

1

您没有在List类中显示您的成员函数的定义,但我敢打赌是因为这些成员函数试图从Node类访问nextPtr。您可以

  1. 使从Node
  2. nextPtr公共添加公共访问函数来Node访问它
  3. 声明ListNode朋友,friend class List;
+0

谢谢!我使用'friend class List'方法来修复它。 – rafafan2010

1

因为在某处你的代码,您可以通过Node类非成员函数访问Node * nextPtr。您可以为nextPrt创建getter以避免这种情况。