3

我有这样的课:

class Node {
    // data
    Node* next;
    void operator++(int);
};

当我像这样定义后增量运算符时:

void Node::operator++(int) {
    this = this->next;
}

我得到错误Expression is not assignablethis = this->next;

这是怎么回事?我如何this指向next

4

7 回答 7

2

甚至不要尝试。它不起作用,如果你能让它起作用,无论如何这将是一件坏事。

从外观上看,您的节点类似于链表。如果是这种情况,那么您通常想要的是:

template <class T>
class linked_list { 

    class node { 
        node *next;
        T data;
    };

    node *head;
public:
    class iterator { 
        node *n;
    public:
        iterator(node *n=NULL) : n(n) {}

        iterator &operator++() { 
            n=n->next;
            return *this;
        }
        bool operator!=(iterator const &other) const { 
            return n != other.n;
        }
        // ...        
    };

    iterator begin() { return iterator(n); }
    iterator end()   { return iterator();  }
};
于 2013-03-11T07:31:08.233 回答
1

这是无法改变的。它是恒定的。

于 2013-03-11T07:29:45.207 回答
1

根据 C++ 标准,this指针是纯右值表达式(参见[ class.this ]),但是赋值运算符需要一个左值作为其左操作数(参见[expr.ass])。

于 2016-05-05T13:29:25.057 回答
0

你不能这样做。即使通过一些肮脏的技巧你改变this了,改变也不会传播给调用者。this是方法的隐藏形式参数。

于 2013-03-11T07:20:51.833 回答
0

就您在这里尝试做的事情而言,您似乎很困惑。您有一个node代表列表中节点的类。通常还有一个iterator类,它代表您当前在列表中的位置。在我看来,您正试图用来++迭代到列表中的下一个项目,但要做到这一点,您需要将迭代器作为它自己的一个类。

一般来说,分配给this指针是没有意义的——this指的是当前对象上下文,你不能仅仅通过设置this指针来改变那个上下文。

我希望这会对你有所帮助。

于 2013-03-11T07:24:29.640 回答
0

您刚刚发现了为什么 STL 有迭代器。迭代器将指向节点的指针作为其自身的成员,或者在某些情况下它是指针。它也可以修改它的成员变量。也许尝试类似:

class Iterator {
    Node* node;
public:
    Iterator(Node* n)
        : node( n )
    {}

    Iterator& operator++()
    {
        node = node->next;
        return *this;
    }

    Iterator operator++(int)
    {
        Node* current = node;
        node = node->next;
        return Iterator(current);
    }

    Node& operator*()
    {
        return *node;
    }

    const Node& operator*() const; // etc...
};
于 2013-03-11T07:30:04.420 回答
-1

隐藏参数“this”与“const”限定符一起传递。因此无法更改。 隐藏这个

于 2013-03-11T07:26:04.180 回答