在 C++ 中,我的运算符重载前缀不起作用
in c++ my operator overloading prefix not work
问题已修改
我有一个包含 add()
和 begin()
函数的列表 class(类似于链接列表)
add()
添加到尾部的函数
begin()
函数表示returns第一个元素(head)的地址
我尝试让我的 class 支持范围 for(:)
所以我尝试实现 begin()
、end()
和 operator++()
函数,但是我卡在 operator++()
它不起作用 (阅读下面的注释)
新增
问题是 i
是一个节点指针,所以我不能这样做 ++i
这只会增加指针的地址,而不会 运行 operator++()
因为它是节点指针而不是节点结构中的对象所以当我这样做时 ++(*i)
它会 运行 operator++()
#include <iostream>
using namespace std;
class List
{
struct Node
{
int info;
Node *next;
Node(int val) : info(val), next(NULL) {}
Node * operator++(){ // not working
cout << "i am alive\n";
*this = *this->next;
return this;
}
};
Node *head = NULL;
Node *tail = NULL;
public:
void add(int val) // add to tail, O(1)
{
Node *temp = new Node(val);
if (!head)
{
head = temp;
tail = temp;
return;
}
tail->next = temp;
tail = temp;
}
Node *begin()
{
return head;
}
};
int main()
{
List l;
l.add(2);
l.add(5);
l.add(10);
auto i = l.begin(); // *i is 2
++i;
cout << (*i).info; // output is 0
}
注意:
如果我这样做,它会工作并打印 5
auto i = l.begin(); // *i is 2
i->operator++(); // will work
// ++(*i); //also will work
cout << (*i).info; // output is 5
您可以使用 Node
轻松实现一个 const
类似迭代器的对象,如下所示。但是,如果您希望能够通过迭代器修改列表,您可能必须创建一个新的 class.
Node &operator++(){
return *this = *this->next;
}
int operator*() {
return this->info;
}
Node cbegin() {
return *head;
}
您对增量运算符的实现方法是错误的。它不应该 return 增量值。相反,它应该增加调用它的对象的值。然后,它应该 return 前缀变体对该对象的引用或后缀变体中先前值的副本。
您的代码的问题还在于它将苹果与橙子进行比较。您的 i
是一个指针,而 ++i
只会增加该指针。它不关心您的 class 是否实现了增量运算符。为了调用它,您需要 ++*i
.
谢谢大家,我像你说的那样自己实现迭代器Class解决了问题
我的 class 现在支持范围 for(:)
#include <iostream>
using namespace std;
class List
{
struct Node
{
int info;
Node * next;
Node(int val): info(val), next(NULL) {}
};
class Iterator
{
Node * ptr;
public:
Iterator(Node *p): ptr(p) {}
Iterator & operator=(Node * Np)
{
ptr = Np;
return *this;
}
bool operator!=(Iterator & it)
{
return this->ptr != it.ptr;
}
Iterator &operator++()
{
if (ptr)
{
ptr = ptr->next;
return * this;
}
}
Iterator &operator++(int)
{
Iterator it = *this;
++(*this);
return it;
}
int operator*()
{
return ptr->info;
}
};
Node *head = NULL;
Node *tail = NULL;
public:
void add(int val) // add to tail, O(1)
{
Node *temp = new Node(val);
if (!head)
{
head = temp;
tail = temp;
return;
}
tail->next = temp;
tail = temp;
}
Iterator begin()
{
return Iterator(head);
}
Iterator end()
{
return Iterator(NULL);
}
};
int main()
{
List l;
l.add(2);
l.add(5);
l.add(10);
auto i = l.begin();
++i;
cout << *i <<'\n'; // output 5
for(auto it : l){
cout << it <<' '; // output 2 5 10
}
}
问题已修改
我有一个包含 add()
和 begin()
函数的列表 class(类似于链接列表)
add()
添加到尾部的函数
begin()
函数表示returns第一个元素(head)的地址
我尝试让我的 class 支持范围 for(:)
所以我尝试实现 begin()
、end()
和 operator++()
函数,但是我卡在 operator++()
它不起作用 (阅读下面的注释)
新增
问题是 i
是一个节点指针,所以我不能这样做 ++i
这只会增加指针的地址,而不会 运行 operator++()
因为它是节点指针而不是节点结构中的对象所以当我这样做时 ++(*i)
它会 运行 operator++()
#include <iostream>
using namespace std;
class List
{
struct Node
{
int info;
Node *next;
Node(int val) : info(val), next(NULL) {}
Node * operator++(){ // not working
cout << "i am alive\n";
*this = *this->next;
return this;
}
};
Node *head = NULL;
Node *tail = NULL;
public:
void add(int val) // add to tail, O(1)
{
Node *temp = new Node(val);
if (!head)
{
head = temp;
tail = temp;
return;
}
tail->next = temp;
tail = temp;
}
Node *begin()
{
return head;
}
};
int main()
{
List l;
l.add(2);
l.add(5);
l.add(10);
auto i = l.begin(); // *i is 2
++i;
cout << (*i).info; // output is 0
}
注意: 如果我这样做,它会工作并打印 5
auto i = l.begin(); // *i is 2
i->operator++(); // will work
// ++(*i); //also will work
cout << (*i).info; // output is 5
您可以使用 Node
轻松实现一个 const
类似迭代器的对象,如下所示。但是,如果您希望能够通过迭代器修改列表,您可能必须创建一个新的 class.
Node &operator++(){
return *this = *this->next;
}
int operator*() {
return this->info;
}
Node cbegin() {
return *head;
}
您对增量运算符的实现方法是错误的。它不应该 return 增量值。相反,它应该增加调用它的对象的值。然后,它应该 return 前缀变体对该对象的引用或后缀变体中先前值的副本。
您的代码的问题还在于它将苹果与橙子进行比较。您的 i
是一个指针,而 ++i
只会增加该指针。它不关心您的 class 是否实现了增量运算符。为了调用它,您需要 ++*i
.
谢谢大家,我像你说的那样自己实现迭代器Class解决了问题
我的 class 现在支持范围 for(:)
#include <iostream>
using namespace std;
class List
{
struct Node
{
int info;
Node * next;
Node(int val): info(val), next(NULL) {}
};
class Iterator
{
Node * ptr;
public:
Iterator(Node *p): ptr(p) {}
Iterator & operator=(Node * Np)
{
ptr = Np;
return *this;
}
bool operator!=(Iterator & it)
{
return this->ptr != it.ptr;
}
Iterator &operator++()
{
if (ptr)
{
ptr = ptr->next;
return * this;
}
}
Iterator &operator++(int)
{
Iterator it = *this;
++(*this);
return it;
}
int operator*()
{
return ptr->info;
}
};
Node *head = NULL;
Node *tail = NULL;
public:
void add(int val) // add to tail, O(1)
{
Node *temp = new Node(val);
if (!head)
{
head = temp;
tail = temp;
return;
}
tail->next = temp;
tail = temp;
}
Iterator begin()
{
return Iterator(head);
}
Iterator end()
{
return Iterator(NULL);
}
};
int main()
{
List l;
l.add(2);
l.add(5);
l.add(10);
auto i = l.begin();
++i;
cout << *i <<'\n'; // output 5
for(auto it : l){
cout << it <<' '; // output 2 5 10
}
}