在 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
    }
}