如何从字符串列表更改为指向字符串的指针列表

how to change from a list of strings to a list of pointers to strings

本文关键字:列表 字符串 指针      更新时间:2023-10-16

我试图让它返回一个字符串,但我无法让它工作。 目标是拥有一个指向字符串的双向链表。 我不允许它包含字符串,它必须指向它。 目前,我在让我的程序使用它时遇到问题。 例如,它似乎总是返回命令是什么,它让我感到困惑并且难以解释。

#ifndef DOUBLY_LINKED_LIST_H
#define DOUBLY_LINKED_LIST_H
#include <iostream>
#include <string>
//#include "Playlist.h"
using namespace std;
class DoublyLinkedList
{
public:
    DoublyLinkedList();
    ~DoublyLinkedList();
    bool empty();
    void append(string& s);
    void insertBefore(string& s);
    void insertAfter(string& s);
    void remove(string& s);
    void begin();
    void end();
    bool next();
    bool prev();
    bool find(string& s);
    const string& getData();
private:
    class Node
    {
    public:
        Node (string *data, Node *next, Node *prev)
        {m_data = data; m_next = next; m_prev = prev;}
        string *m_data;
        Node * m_next;
        Node * m_prev;
    };
    Node *m_head;
    Node *m_tail;
    Node *m_current;
};
#endif // DOUBLYLINKEDLIST_H_INCLUDED

.cpp文件>>>>

const string& DoublyLinkedList::getData()
{
    string *m_tmp;
    m_tmp = m_current->m_data;
    cout << m_current->m_data << endl;
    //cout << "returning: " << m_current->m_data << endl;
   // return m_current->m_data;
   return *m_tmp;
}
void DoublyLinkedList::append(string &s)
{
    if (!m_head)
    {
        m_head = new Node(&s, NULL, NULL);
        m_tail = m_head;
        m_current = m_head;
    }
    else
    {
        m_tail->m_next = new Node (&s, NULL, m_tail);
        m_tail = m_tail->m_next;
        m_current = m_tail;
    }
}

考虑以下示例:

#include <iostream>
#include <vector>
#include <string>
using namespace std;
void store_value(vector<string*>& vec, string& str)
{
  vec.push_back(&str);
}
void create_and_store_value(vector<string*>& vec)
{
  string str("This string is temporary");
  store_value(vec, str);
}
int main(int argc, char** argv)
{
  vector<string*> pointers;
  create_and_store_value(pointers);
  cout << *pointers.back() << endl;
  string myPersistingString("Yay");
  store_value(pointers, myPersistingString);
  cout << *pointers.back() << endl;
  return 0;
}

此示例包含两个函数,一个函数store_value其行为类似于您的append函数(除了,出于此示例的目的处理std::vector)和第二个函数显示获取引用地址的可能危险(这是我相信 Manu343726 和 Mats Petersson 也在前奏的可能危险之一)。

这很危险的原因是,在函数完成后,create_and_store_value 中声明的字符串不会保留。 这意味着我们留下了一个指向内存的指针,这可能不是我们所期望的。 另一方面,在 main 函数内创建一个字符串是可以的,因为那里的字符串会一直持续到程序结束。

为了进一步帮助您,我建议您编辑您的问题,给我们一个您如何调用函数的示例。 我建议粘贴代码的最小条带化版本,包括如何调用 append 的示例,例如:

#include <blah>
class DoubleLinkedList
{
    DoubleLinkedList(void)
    {
        // Include these inline to make copying and pasting simpler.
    }
    ~DoubleLinkedList(void)
    {
        ...
    }
    append(...) { ... }
    getData(...) { ... }
};
int main(int argc, char** argv)
{
    DoubleLinkedList dll;
    // Show us how you are using this list
    return 0;
}

在上面,将注释和点替换为相关代码。