所以我已经测试了一个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;因此我可以看到每一步发生了什么,但我仍然无法找出问题所在。
答案 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<<
重载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]);
复制到另一个list
。您可能没有,这可能会导致您遇到的访问冲突。
begin()
这是C ++语法越来越好的另一个领域。您显然希望调用SortedArray
的{{1}}方法来获取第一个元素的迭代器,然后取消引用迭代器来访问operator[]
对象,然后调用{{1}在那个数组上。要正确地做到这一点(并使代码更具可读性),您应该重新排列括号:
cout << (*(aList->begin()))[0];