C++ 迭代器和常量迭代器运算符++;邮政和前缀

C++ 迭代器和常量迭代器运算符++;邮政和前缀,c++,iterator,operator-overloading,prefix-operator,C++,Iterator,Operator Overloading,Prefix Operator,我们正在开发一个自定义列表类。我们试图实现迭代器和const_迭代器及其函数,但我们的++运算符有问题。后缀根本不起作用,当我们走得太远时,前缀会给我们segfault(当前代码是一种只返回最后一个有效结果的变通方法)。 问题1:如何在不返回最后一个有效元素的情况下修复与前缀相关的segfault?(我们已尝试返回nullptr) Postfix不会重复,尽管我们已经遵循了互联网上的每一个指南尝试一下: clst++; 而不是: clst = clst++; 后者将clst重置为其原始值(就

我们正在开发一个自定义列表类。我们试图实现迭代器和const_迭代器及其函数,但我们的++运算符有问题。后缀根本不起作用,当我们走得太远时,前缀会给我们segfault(当前代码是一种只返回最后一个有效结果的变通方法)。 问题1:如何在不返回最后一个有效元素的情况下修复与前缀相关的segfault?(我们已尝试返回nullptr)

Postfix不会重复,尽管我们已经遵循了互联网上的每一个指南尝试一下:

clst++;
而不是:

clst = clst++;

后者将
clst
重置为其原始值(就好像增量没有发生一样)。

假定后缀运算符返回旧值,您希望从
clst=clst++(除了未定义的行为)?是的,这就解决了它!如果迭代到达列表的末尾,您对我们应该做什么有什么想法吗?因为从长远来看,仅仅返回最后一个有效值似乎不是一个很好的解决办法=)@JohanHjalmarsson,我认为您应该像标准库一样,让它不被定义(即失败得很惨)。通过与“end”迭代器的比较,调用方应将迭代限定为。@JohanHjalmarsson:当迭代器到达
list1
的末尾时,它应与
list1.cend()进行比较。因此,您可以检查它,例如,
for(it=list1.cbegin();it!=list1.cend();++it){/*…*/}
无论多么糟糕,
clst=clst++不是未定义的。你甚至:)@jrok:的确-我很遗憾意识到这不是
++
操作符,而是一个函数调用。我责备我的大脑的模式匹配引擎。
val: 324
val2: 324
val3: 324
val: 2
val2: 3
val3: 3  <-- This is where we segfault if we don't use the controll.
clst++;
clst = clst++;