我有一个类似的课程:
class Node {
// data
Node* next;
void operator++(int);
};
当我像这样定义后增量运算符时:
void Node::operator++(int) {
this = this->next;
}
我在Expression is not assignable
上收到错误this = this->next;
。
这是什么?如何让this
指向next
?
答案 0 :(得分: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(); }
};
答案 1 :(得分:1)
这不能改变。它是不变的。
答案 2 :(得分:1)
根据C ++标准,this
指针是 prvalue 表达式(请参阅[class.this]),但赋值运算符需要左值它的左操作数(见[expr.ass])。
答案 3 :(得分:0)
你做不到。即使通过一些肮脏的技巧改变this
,更改也不会传播给调用者。 this
是方法的隐藏形式论证。
答案 4 :(得分:0)
这是不可能的。在呼叫方那边做,如下所示:
current_node = current_node->next;
答案 5 :(得分:0)
你在这里尝试做什么似乎很困惑。您有一个node
类,表示列表中的节点。通常情况下,还会有一个iterator
类,表示您当前所在列表中的位置。在我看来,你试图使用++
迭代到列表中的下一个项目,但要做到这一点,你需要将迭代器作为它自己的类。
通常,分配给this
指针没有意义 - this
引用当前对象上下文,您不能通过设置this
指针来改变该上下文。
我希望这会对你有所帮助。
答案 6 :(得分: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...
};
答案 7 :(得分:-1)
隐藏参数'this'与'const'限定符一起传递。因此它无法改变。 Hidden this