我有这样的课:
class Node {
// data
Node* next;
void operator++(int);
};
当我像这样定义后增量运算符时:
void Node::operator++(int) {
this = this->next;
}
我得到错误Expression is not assignable
。this = this->next;
这是怎么回事?我如何this
指向next
?
我有这样的课:
class Node {
// data
Node* next;
void operator++(int);
};
当我像这样定义后增量运算符时:
void Node::operator++(int) {
this = this->next;
}
我得到错误Expression is not assignable
。this = this->next;
这是怎么回事?我如何this
指向next
?
甚至不要尝试。它不起作用,如果你能让它起作用,无论如何这将是一件坏事。
从外观上看,您的节点类似于链表。如果是这种情况,那么您通常想要的是:
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(); }
};
这是无法改变的。它是恒定的。
根据 C++ 标准,this
指针是纯右值表达式(参见[ class.this ]),但是赋值运算符需要一个左值作为其左操作数(参见[expr.ass])。
你不能这样做。即使通过一些肮脏的技巧你改变this
了,改变也不会传播给调用者。this
是方法的隐藏形式参数。
就您在这里尝试做的事情而言,您似乎很困惑。您有一个node
代表列表中节点的类。通常还有一个iterator
类,它代表您当前在列表中的位置。在我看来,您正试图用来++
迭代到列表中的下一个项目,但要做到这一点,您需要将迭代器作为它自己的一个类。
一般来说,分配给this
指针是没有意义的——this
指的是当前对象上下文,你不能仅仅通过设置this
指针来改变那个上下文。
我希望这会对你有所帮助。
您刚刚发现了为什么 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...
};
隐藏参数“this”与“const”限定符一起传递。因此无法更改。 隐藏这个