我目前正在创建一个方形列表,其中一个要求是重载前缀和后缀++操作符。
我试图重载.hpp文件中的++operator以递增迭代器。但在调用++operator时,它不会调用重载的代码,而只是使用默认值。
iterator& operator ++ () { // pre-increment
std::list<int>::iterator i = list_Values.begin();
advance(i,1);
return &*i;
}
iterator operator ++ (int) { // post-increment
std::list<int>::iterator i = list_Values.begin();
advance(i,1);
return &*i;
} 我尝试这样调用++operator:
int* test = sqrList.begin();
++test;
test++;发布于 2012-02-22 07:02:22
int* test = sqrList.begin();
++test;
test++;您正在递增一个int*,并且由于没有要扩展的int*类,因此您不可能真正为该类型创建了运算符。
而是为正确的类型创建操作符。您的意思可能是创建自己的迭代器类型。
发布于 2012-02-22 06:26:45
你必须在类中声明运算符。
class Iterator
{
public:
Iterator& operator ++ ()
{
return *this;
}
Iterator operator ++ (int)
{
return *this;
}
};另外,您为什么要使用return &*i;
请注意,这些操作符需要在Iterator类中声明,而不是在容器中声明。
发布于 2019-05-05 21:12:02
对于新手来说,有时很难脱离上下文来理解一个问题。因此,我决定提供一个或多或少完整的示例来定义自定义迭代器和重载它的运算符。请注意,当重载post增量运算符时,我们按值返回迭代器,而不是按引用。当然,这不是一个真实的例子,我们不会使用原始指针。
#include<iostream>
#include<assert.h>
struct node
{
int data;
node* next;
node() :data(0), next(nullptr) {}
node(int d) :data(d), next(nullptr) {}
};
//forward declaration
class MyList;
class MyListIterator
{
private:
node* _ptr;
friend class MyList;
explicit MyListIterator(node* n) : _ptr(n) {}
public:
int& operator*() const {
return _ptr->data;
}
//overload pre increment operator
MyListIterator& operator++() {
_ptr = _ptr->next;
return *this;
}
// overload post increment operator
MyListIterator operator++(int) {
MyListIterator ret = *this;
++* (this);
return ret;
}
bool operator==(const MyListIterator& iter) const {
return this->_ptr == iter._ptr;
}
bool operator!=(const MyListIterator& iter) const {
return this->_ptr != iter._ptr;
}
};
class MyList
{
private:
node* _head;
node* _tail;
size_t _size;
public:
MyList() : _head(nullptr), _tail(nullptr), _size(0) {};
void push_back(int d) {
node* newTail = new node(d);
if (_tail != nullptr) {
_tail->next = newTail;
}
else {
_head = newTail;
}
_tail = newTail;
_size++;
}
int& operator[](size_t i) {
if (i >= _size)
throw std::out_of_range("MyList");
node * p = _head;
for (size_t j = 0; j < i; j++) {
p = p->next;
}
return p->data;
}
void remove(int d) {
if (_head == nullptr)
return;
node * p = _head;
node * prev = p;
while ((p != nullptr) && (p->data != d)) {
prev = p;
p = p->next;
}
if (p != nullptr) {
if (p == _head)
_head = p->next;
else
prev->next = p->next;
delete p;
_size--;
}
}
size_t size() const {
return _size;
}
~MyList() {
node* next = nullptr;
for (node* p = _head; p != nullptr; p = next) {
next = p->next;
delete p;
}
}
using iterator = MyListIterator;
iterator begin() { return iterator(_head); }
iterator end() { return iterator(_tail->next); }
};
int main()
{
MyList mylist;
mylist.push_back(1);
mylist.push_back(2);
mylist.push_back(3);
int count = 1;
//pre increment
for (MyListIterator it = mylist.begin(); it != mylist.end(); ++it)
assert(*it == count++);
count = 1;
//post increment
for (MyListIterator it = mylist.begin(); it != mylist.end(); it++)
assert(*it == count++);
for (size_t i = 0; i < 3; i++)
assert(mylist[i] == i + 1);
mylist.remove(2);
assert(mylist[0] == 1);
assert(mylist[1] == 3);
assert(mylist.size() ==2);
mylist.remove(1);
mylist.remove(3);
assert(mylist.size() == 0);
}https://stackoverflow.com/questions/9386266
复制相似问题