2013-03-11 73 views
2

我有一个类,像这样:不能分配给该

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

当我定义递增运算符,就像这样:

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

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

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

+0

'this'只能用作指向当前实例的指针。指派给“this”是没有意义的。你为什么想这么做 ? – Tuxdude 2013-03-11 07:20:45

+0

也许你可以改成'Node * Node :: operator ++(int){return this-> next; }' – Jichao 2013-03-11 07:22:34

+1

顺便说一句,后缀'operator ++'返回void是很奇怪的。这势必会混淆用户。人们会期望它返回一个“节点”。 – juanchopanza 2013-03-11 07:25:42

回答

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(); } 
}; 
+0

因此,基本上使用'linked_list :: iterator'的'++'运算符来遍历列表,而不是试图给'linked_list :: node'它自己的'++'运算符? – anthropomorphic 2013-03-11 08:11:04

+1

我怀疑'operator ++'是否正确,应该返回* this;'。 – 2013-03-11 08:23:19

+0

@MichaelDorst:正确。增加链表的节点根本没有多少意义。递增迭代器的确如此。 – 2013-03-11 13:17:31

0

你不能那样做。即使通过一些肮脏的窍门你改变this,改变将不会传播给调用者。 this是一种隐藏的方法论。

0

这是不可能的。在呼叫方这样做,像下面这样:

current_node = current_node->next; 
0

你似乎很困惑,你在这里试图做什么。您有一个node类,它表示列表中的一个节点。通常,还会有一个iterator类,它代表您当前位于列表中的位置。在我看来,您试图使用++迭代到列表中的下一项,但要做到这一点,您需要将迭代器作为它自己的类。

一般来说是没有意义分配给this指针 - this指的是当前对象的情况下,你不能仅仅通过设置this指针更改背景。

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

-1

隐藏参数'this'与'const'限定符一起传递。因此它不能改变。 Hidden this

1

这是不能改变的。它是不变的。

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... 
}; 
+0

如果解除引用运算符返回'node-> data',它不会更有意义吗? (假设'data'是我们正在迭代的成员的名称),还是更好地提供对节点的访问而不仅仅是值? – anthropomorphic 2013-03-11 08:25:55

+0

是的,没有。这与所有其他迭代器的工作方式都很不一致。它起初可能看起来很方便,但它有点太“魔力”,破坏了清晰的分层。如果您将'Node'转换为您的容器的内部类并且'Iterator'成为该设计的一部分,那么您当然可以直接返回对数据的引用。总的来说,我建议你阅读更多关于STL中的容器和迭代器的内容,因为这里的主题对于简单的Q/A风格来说太宽泛了。 – 2013-03-11 08:38:09

1

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

相关问题