你如何使用从字符串*访问信息?
How do you use access the information from a string*?
我正在使用双向链表,我正在尝试使用通过引用传递的数据在所述数据之前插入一个节点。我已经使用 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;
}
没有理由使用指向 string
的指针,这会强制您管理内存。请改用简单的 string
。
但这不是这里的问题。这里的局部变量与 Node
的 class 成员同名,并且节点中的成员永远不会被初始化。此外 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;
}
现在,如一开始所说,将指向字符串的指针替换为字符串。至少,您将避免内存泄漏、浅拷贝和许多其他麻烦。然后您可以更好地关注链表数据结构的实际问题。
我正在使用双向链表,我正在尝试使用通过引用传递的数据在所述数据之前插入一个节点。我已经使用 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;
}
没有理由使用指向 string
的指针,这会强制您管理内存。请改用简单的 string
。
但这不是这里的问题。这里的局部变量与 Node
的 class 成员同名,并且节点中的成员永远不会被初始化。此外 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;
}
现在,如一开始所说,将指向字符串的指针替换为字符串。至少,您将避免内存泄漏、浅拷贝和许多其他麻烦。然后您可以更好地关注链表数据结构的实际问题。