我试图在另一个链接列表中创建链接列表,这是我的代码
template<typename T>
class List {
private:
int length;
class Node {
public:
T data;
Node* next;
} *head;
public:
List();
~List();
void insert(T item);
void remove(T item);
void empty();
T* getAll();
int count() const;
};
template<typename T>
void List<T>::insert(T item)
{
if (head == NULL)
{
head = new Node();
head->data = item;
head->next = NULL;
length = 1;
return;
}
Node* p = new Node();
p->data = item;
p->next = head;
head = p;
++length;
}
struct Remainder {
Date dt;
List<int> notes;
};
void getDayEvents(Date dt, List<Remainder> l)
{
Remainder* arr = new Remainder[l.count()];
arr = l.getAll();
for (int i = 0; i < l.count(); i++)
{
if (arr[i].dt.day == dt.day && arr[i].dt.month == dt.month && arr[i].dt.year == dt.year)
{
int* nArr = new int[arr[i].notes.count()];
nArr = arr[i].notes.getAll();
for (int j = 0; j < arr[i].notes.count(); j++)
{
cout << nArr[j] << endl;
}
}
}
}
int _tmain() {
Date dt1, dt2;
dt1.setDate(17, 7, 2015);
dt2.setDate(5, 11, 2015);
Remainder r1, r2;
r1.dt = dt1;
r1.notes.insert(1);
r1.notes.insert(2);
r2.dt = dt2;
r2.notes.insert(5);
List<Remainder> l;
l.insert(r1);
l.insert(r2);
getDayEvents(dt1, l);
//----------------------------------------------------------
int pause;
cin >> pause;
return 0;
}
当在列表中插入r1或r2时,每个剩余部分内的注释列表中的数据就会消失或被破坏
我不知道为什么?错误在哪里?
答案 0 :(得分:3)
您按价值将对象传递到insert
函数。
这意味着正在调用复制构造函数和析构函数。
您没有声明List
的复制构造函数,所以可能是这样
由编译器生成,并且可能正在制作一个
复制构造函数时List
的“浅”副本
Remainder
的副本会复制输入Remainder
的成员。
我认为这会将指针head
从一个List
复制到另一个List
所以现在你有
两个head
个对象,其List
个指针指向同一个对象。
您尚未显示Node
析构函数的定义,
但是根据你在析构函数中的操作,它可能会被删除
被List
被破坏的List
指向另一个Node
operator =
仍然有一个指向同一List
的指针。
这可能听起来令人困惑,坦率地说,我不确定我能算数 正确调用构造函数和析构函数, 所以最好确保它们永远不会被不安全地使用。
一个好的开始可能是定义自己的复制构造函数和
List
的{{1}}以新List
所具有的方式
新分配的旧head
中所有内容的副本。
永远不要让两个List
指针指向同一个对象。
在将一个List
插入另一个之后,您应该可以
在调试器中确认$ curl https://api.github.com/repos/cljsinfo/api-docs/releases/1260660/assets
[
]