您如何使用从字符串*访问信息?

时间:2019-02-09 19:18:25

标签: c++ string pointers doubly-linked-list

我正在使用双向链表,并且尝试使用通过引用传递的数据在所述数据之前插入节点。我曾经使用string* data = new string(s);来分配内存,但是当我尝试使用数据时却出现错误。

    #ifndef __DOUBLYLINKEDLIST_H__
    #define __DOUBLYLINKEDLIST_H__
    //
    //
    #include
    #include
    using namespace std;

    class DoublyLinkedList {
    public:
      DoublyLinkedList();
      ~DoublyLinkedList();
      void append (const string& s);
      void insertBefore (const string& s);
      void insertAfter (const string& s);
      void remove (const string& s);
      bool empty();
      void begin();
      void end();
      bool next();
      bool prev();
      bool find(const string& s);
      const std::string& getData() const;

    private:
      class Node
      {
      public:
      Node();
      Node(const string& data);
      ~Node();
      Node* next;
      Node* prev;
      string* data;
      };
      Node* head;
      Node* tail;
      Node* current;
      };

  void DoublyLinkedList::insertBefore(const string& s)
  {
  Node* ptr = head;
  string* data = new string(s);
  if (head == NULL)
   { 
        append(s);
        return;
  }
  if (head == current)
  {
        //this is where I get an error...
        this->data= new Node();
        current->prev = head;
        current = head;
        return;

  }

1 个答案:

答案 0 :(得分:2)

没有理由使用指向string的指针,这会迫使您管理内存。请改用简单的string

但这不是这里的问题。在这里,局部变量与Node的类成员具有相同的名称,并且节点中的成员永远不会被初始化。此外,DoublyLinkedList本身没有这样的成员,因此this->data是未知的。在这里查看我的评论:

void DoublyLinkedList::insertBefore(const string& s)
{
    ...
    string* data = new string(s);   // --> ok, but this is local variable
    if (head == NULL)
    { 
        append(s);     
        return;     // ouch !!!  memory leak !! data pointer is never freed
    }
    if (head == current)
    {
        //this is where I get an error...
        this->data= new Node();     // --> 'this' is a DoublyLinkedList, not a Node 
        ...
        return;
  }

现在这样说,您是否有可能在DoublyLinkedList和它包含的节点之间造成混淆?请参阅此处的修正开始,但是您需要做更多的工作来处理节点之间的链接:

void DoublyLinkedList::insertBefore(const string& s)
{
  Node* ptr = head;
  if (head == NULL)
  { 
        append(s);     
        return;     
  }
  if (head == current)
  {
        string* data = new string(s);
        Node nd = new Node();
        nd->data = data;        // initialize node's pointer
        nd->prev = ...          // you need to link new node to the rest
        nd->next = ...  
        ...                    // and you need to update the previous and next node
        return;
  }

现在,首先,将字符串的指针替换为字符串。至少,您将避免内存泄漏,浅拷贝和其他许多麻烦。然后,您可以更好地关注链表数据结构的实际问题。