C ++,很难插入列表

时间:2018-03-19 22:37:17

标签: c++

所以我已经测试了一个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&lt;&lt;因此我可以看到每一步发生了什么,但我仍然无法找出问题所在。

1 个答案:

答案 0 :(得分:0)

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<<重载SortedArraySortedArray作为输入。如果您想要传递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]); 复制到另一个list。您可能没有,这可能会导致您遇到的访问冲突。

begin()

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

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