0

これで文字列を返そうとしていますが、うまく動作しません。目標は、文字列を指す二重リンク リストを作成することです。文字列を含めることは許可されていません。代わりにそれを指す必要があります。現在、プログラムで使用するのに問題があります。たとえば、コマンドが何であったかを常に返すように見えますが、それは私を混乱させ、説明するのが難しいです.

#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;
    }
}
4

1 に答える 1

0

次の例を検討してください。

#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;
}

この例には 2 つの関数が含まれています。1 つは関数store_valueと同様に動作しますappend(ただし、この例では で動作しますstd::vector)。 Manu343726 と Mats Petersson も前奏曲だと思います)。

これが危険な理由は、内部で宣言された文字列がcreate_and_store_value関数の完了後に保持されないためです。これは、おそらく期待していないメモリへのポインタが残っていることを意味します。一方、main関数内に文字列を作成することは問題ありません。文字列はプログラムの最後まで存続するからです。

さらにサポートするために、質問を編集して、関数を呼び出す方法の例を提供することをお勧めします。次のような追加の呼び出し方法の例を含む、コードの最小限のストライプダウンバージョンを貼り付けることをお勧めします。

#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;
}

上記のコメントとドットを関連するコードに置き換えます。

于 2013-09-15T06:54:03.640 に答える