C++,难以插入列表

C++, having difficulty inserting into a list

本文关键字:插入列 列表 插入 C++      更新时间:2023-10-16

所以我做了一个我测试过的 SortedArray 类,它工作正常,但是当我尝试插入到列表中时,每当我尝试访问 SortedArray 时,我都会出现读取访问冲突。

list* aList = new list<SortedArray<T>>();
//creates an array of T* with length l and filled with NULL pointers
SortedArray<DT>* sa = new SortedArray<T>(l); 
cout << endl <<sa[0] <<endl; //returns nothing because NULL 
aList->push_front(*sa); //is the *sa the problem?
//should return NULL as well but throws read access violation
cout << ((*aList->begin())[0]);

我把cout<<线条放进去,这样我就能看到每一步发生了什么,但我仍然无法弄清楚问题所在。

list* aList = new list<SortedArray<T>>();

这将创建一个新的list对象,该对象包含实际的SortedArray<T>对象,而不是指向对象的指针。

SortedArray<DT>* sa = new SortedArray<T>(l); 

这将创建一个新的SortedArray对象,该对象(大概)保存实际的DT对象,而不是指向DT对象的指针。

cout << endl <<sa[0] <<endl; //returns nothing because NULL 

在此语句中,sa是一个指针,因此您正在执行指针算术而不是调用SortedArray::operator[](假设有一个)。 因为sa是一个指针,所以sa[0]*(sa+0)相同,所以你SortedArray对象传递给operator<<(除非你重载了operator<<,否则它不会编译,将SortedArray作为输入)。 如果你想传递SortedArray的第一个元素,你需要取消引用指针,然后才能调用SortedArray::operator[]

cout << endl << (*sa)[0] <<endl;
aList->push_front(*sa); //is the *sa the problem?

此语句很好,前提是SortedArray实现了正确的复制构造函数。push_front()将复制您传入的SortedArray对象,因此请确保将数组元素从一个SortedArray正确复制到另一个。 您可能不是,这可能会导致您遇到的访问冲突。

//should return NULL as well but throws read access violation
cout << ((*aList->begin())[0]);

这是C++语法越来越好的另一个领域。 您显然希望调用listbegin()方法来获取第一个元素的迭代器,然后取消引用该迭代器以访问SortedArray对象,然后在该数组上调用operator[]。 要正确执行此操作(并使代码更具可读性),您应该重新排列括号:

cout << (*(aList->begin()))[0];